Я немного заинтригован тем, как работают некоторые бойкие функции, такие как "g_ascii_dtostr" (и функции GKeyFile, использующие двойники).
Рассмотрим эту строку:
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» должно быть без потерь, но меня все еще беспокоит, почему вообще происходит эта странность. Кроме того, это делает мои файлы конфигурации "ключ-значение" довольно уродливыми.
Я думаю, что однажды где-то читал, что используется промежуточный тип «длинный двойной», но это все равно не объясняет, почему преобразованное значение «грязное», потому что, например. я думаю, что преобразование из int в double for не имеет подобных эффектов.
%f
на%.18f
, вы также увидите аналогичный вывод литерала0.2
. - person caf   schedule 31.12.2011