0

「g_ascii_dtostr」(およびdoubleを使用するGKeyFile関数)などの一部のglib関数の動作方法に少し興味があります。

次の行を検討してください。

gchar buf[30];
g_message("Double: %f, as String: %s", 0.2, g_ascii_dtostr(buf, 30, 0.2));

どの出力

Double: 0.200000, as String: 0.20000000000000001

(奇妙な変換は、バッファサイズを十分に高く設定した場合にのみ発生します)

たとえば、ダブル「1.9」をGKeyFileに保存すると、同様のことが起こりますが、結果のファイルでは「1.8999999999999999」として保存されます。どうやら「g_ascii_strtod」を介した変換は無損失であると思われますが、そもそもなぜこの奇妙なことが起こるのか私にはまだ気になります。また、これにより、構成のKey-Valueファイルがかなり醜くなります。

中間の「longdouble」型が使用されていることをどこかで読んだことがあると思いますが、たとえばintからdouble forへの変換では同様の効果がないため、変換された値が「ダーティ」である理由はまだわかりません。おもう。

4

1 に答える 1