Glib: неточность g_ascii_dtostr? - PullRequest
       54

Glib: неточность g_ascii_dtostr?

0 голосов
/ 31 декабря 2011

Я немного заинтригован тем, как работают некоторые функции 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 в удвоение не имеет подобных эффектов.

1 Ответ

1 голос
/ 08 ноября 2013

С документация :

"Эта функция генерирует достаточную точность, чтобы преобразование строки обратно с помощью g_ascii_strtod () давало тот же номер машины (на машинах с 64-битными двойными числами, совместимыми с IEEE)."

Как отметил caf в своем комментарии, спецификатор% f усекается после шести десятичных цифр, поэтому g_ascii_strtod () дает вам более точное значение. Вы можете использовать g_ascii_formatd (), если хотите это усечение.

...