##はじまり
ある日友人から「VBAで1D3が1000で評価されるんだけど」というチャットが来た。1E3ならわかるけど1D3……? HAHAHAそんな馬鹿なと思いやってみると、
print(1E3)
1000
print(1D3)
1000
マジやん……。
##調べた
###ほかの文字
1A3から1Z3までの26種の組み合わせを調べてみる。
Sub test()
Dim c As String
For i = 0 To 25
c = Chr(i + 65)
s = "1" + c + "3"
If IsNumeric(s) Then
Debug.Print (s + ": Number")
Else
Debug.Print (s + ": String")
End If
Next i
End Sub
1A3: String
1B3: String
1C3: String
1D3: Number
1E3: Number
1F3: String
1G3: String
1H3: String
1I3: String
1J3: String
1K3: String
1L3: String
1M3: String
1N3: String
1O3: String
1P3: String
1Q3: String
1R3: String
1S3: String
1T3: String
1U3: String
1V3: String
1W3: String
1X3: String
1Y3: String
1Z3: String
どうもDとEは特別な働きをしているようである。しかしEは指数表記としては有名だけど、Dとはなんぞや?
ネットの海から拾った情報たち
調べてみると次の質問サイトに手掛かりがあった。
BASICでは、倍精度実数の指数表現にはD 単精度実数の指数表現にはE が使われていましたが、
Visual Basicでは、共に倍精度浮動小数点型実数値として処理されます。
なるほどなー。昔のBASICの名残なのか。
そう思ったら次のサイトにはどうも違うことが書いてあった。
VBA, как проще всего определить, число или текст? - Планета Excel
ロシア語のサイトだけど、翻訳しつつ読むとどうもFortranの名残らしい……。
どっちだ⁉
##さらに昔へ
BASICと検索したらVBのことしか出てこないこの世の中で、素のBASICについて検索するのは骨が折れるが、96年発行の冊子がヒットした。
ここの95ページに
倍精度型実数では、指数部の前にDをつけて次のように表示します.
とある。掲示板に書かれていたのは正しいみたい。
次にFortranで探してみると、次のサイトに記述があった。
倍精度を表す場合には "e" の部分を "d" とします。
ということでBASICにもFortranにも同様の機能があることがわかった。どちらに影響を受けたのかはともかく(おそらくFortran→BASIC→VBA?)、昔はこうやって単精度と倍精度を区別していたんだなあ、という思わぬ歴史のお勉強になったのでした。