Я немного заинтригован тем, как работают некоторые функции glib, такие как "g_ascii_dtostr" (и функции GKeyFile, использующие double).
Рассмотрим эту строку:
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" должно быть без потерь, но меня все равно беспокоит, почему эта странность вообще возникает. Кроме того, это делает мои файлы ключей конфигурации довольно уродливыми.
Я думаю, что однажды где-то читал, что используется промежуточный тип "long double", но это все равно не прояснит, почему преобразованное значение является "грязным", потому что, например, я думаю, что преобразование из int в удвоение не имеет подобных эффектов.