__ECVT
FE ファンクションコール名
__ECVT
FE ファンクションコール番号
$FE24
機能
64bit 浮動小数点数を全体の桁数を指定して文字列に変換する
入力
d0d1.d:64bit 浮動小数点数
d2.l: 全体の桁数
a0.l: 文字列バッファの先頭。末尾に '\0' を書き込むので桁数 +1 バイト必要
出力
d0.l: 先頭から小数点の位置までのオフセット
d1.l: 符号(0=+,1=-)
a0.l は変化しない
解説
文字列に書くのは仮数部の数字のみ
符号と小数点と指数部は文字列に書かず、小数点の位置と符号をレジスタに入れて返す
桁数は 255 桁まで指定できるが、有効桁数は 14 桁まで
有効桁数の次の桁で絶対値を四捨五入する
15 桁以上を指定しても 14 桁に丸められ、15 桁目以降はすべて '0' になる
無限大は "#INF"、非数は "#NAN" に変換する
"#INF" と "#NAN" のとき小数点の位置は 4 になる
"#INF" と "#NAN" で 3 桁以下のときは途中で打ち切る
"#INF" と "#NAN" で 5 桁以上のときは 5 桁目以降はすべて '\0' になる
バグ
FLOATn.X は "#INF" と "#NAN" で 1 桁〜3 桁のとき文字列が "$","$0","$00" になってしまう
文字数が少なすぎて "#INF" や "#NAN" が入り切らないのは仕方がないが、無意味な "$00" という文字列になるのは数字ではない文字列を四捨五入しようとするバグが原因
例えば 3 桁のときは 4 桁目の 'F' または 'N' が '5' 以上なので繰り上げて上の位をインクリメントする
'N'+1='O' または 'A'+1='B' が '9' よりも大きいので '0' を上書きして繰り上げて上の位をインクリメントする
'I'+1='J' または 'N'+1='O' も '9' よりも大きいので '0' を上書きして繰り上げて上の位をインクリメントする
'#'+1='$' は '9' 以下なので "$00" になる
X-BASIC で int i2,i3:print ecvt(val("#INF"),3,i2,i3)とすると再現できる
FLOATn.X は "#NAN" と "#INF" で 15 桁以上のとき 5 桁目から 14 桁目までは '\0' だが 15 桁目以降に '0' が書き込まれる
通常は 5 桁目の '\0' で文字列は終了していると見なされるので実害はないが気持ち悪い
FLOAT2.X 2.02/2.03 は 0 のとき小数点の位置が 0 になる
FLOAT4.X 1.02 は 0 のとき小数点の位置が 1 になる
ここでは 1 にしている