Правильная реализация strtod? - PullRequest
4 голосов
/ 03 августа 2011

Простой вопрос: каково правильное битовое представление числа 1.15507e-173 с двойной точностью? Полный вопрос: как определить правильный разбор этого числа?

Справочная информация: мой вопрос следует из этого ответа , который показывает два разных представления битов от трех разных анализаторов, а именно

0x1c06dace8bda0ee0

и

0x1c06dace8bda0edf

и мне интересно, какой парсер понял это правильно.

Обновление В разделе 6.4.4.2 в спецификации C99 сказано, что для синтаксического анализатора C

"...the result is either the nearest representable value, or the larger
or smaller representable value immediately adjacent to the nearest
representable value, chosen in an implementation-defined manner."

Это означает, что разобранный номер не должен быть ни ближайшим, ни даже одним из двух смежных представимых чисел. В той же спецификации в 7.20.1.3 говорится, что strtod () ведет себя в основном так же, как встроенный парсер. Спасибо ответчикам, которые указали на это.

Также см. этот ответ на аналогичный вопрос и этот блог .

1 Ответ

1 голос
/ 03 августа 2011
:= num1 = ImportString["\.1c\.06\.da\.ce\.8b\.da\.0e\.e0", "Real64", ByteOrdering->1] // First;
:= num2 = ImportString["\.1c\.06\.da\.ce\.8b\.da\.0e\.df", "Real64", ByteOrdering->1] // First;
:= SetPrecision[num1, Infinity]-numOr //N
:= numOr =  SetPrecision[1.15507, Infinity] * 10^-173;
             -190
= -6.65645 10
:= SetPrecision[num2, Infinity]-numOr //N
             -189
= -2.46118 10

Учитывая, что оба отклоняются для одной и той же стороны, из этого следует, что правильное представление является первым.

...