Правильная форма числа при изменении точности - PullRequest
0 голосов
/ 22 мая 2018

Предположим, у меня есть некоторая переменная для удвоения точности x, которую я читаю из двоичного файла.При печати этой переменной x = 384.6433096437924

Я хочу «поднять» ее до четверной точности.

integer, parameter :: qp = selected_real_kind(32,307)
integer, parameter :: dp = selected_real_kind(15,307)
real(kind=dp) :: x_double
real(kind=qp) :: x_quad

x_double = 384.6433096437924
x_quad = real(x_double, kind=dp)

print *, x_double, x_quad, 384.64330964379240_qp

Это выводит,

384.6433096437924, 384.64330964379240681882947683334351, 384.643309643792400000000000000000009

Какое из четырех чисел является «лучшим» - т.е. наиболее точным, последовательным и т. Д. Значением для использования?Тот, у кого «мусор», или тот, у кого нет?

Я понимаю (я думаю!) Проблемы, связанные с точным отображением поплавка на компьютере, но не могу понять, какой путь выбрать.

Я компилирую как gfortran -fdefault-real-8

1 Ответ

0 голосов
/ 22 мая 2018

У того, что вы называете «мусором», наименьшая потеря информации из значения double.

Когда 384.6433096437924 конвертируется в число с плавающей запятой двойной точности, результатом является значение вдвоичный формат, и это значение отличается от исходного значения.Если вы знаете, исходное значение имело 16 значащих десятичных цифр, то печать double с 16 десятичными цифрами может привести к получению исходного значения (в большинстве случаев), и это имеет смысл.

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

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

В конечном счете, какая форма лучше всего подходит для отображения, зависит от целей отображения,Хотите сохранить больше информации для будущего использования?Или вы хотите, чтобы результат был легко читаемым человеком?

Наконец, «мусор», который вы показываете, странный.Результат преобразования 384.6433096437924 в базовый 64-разрядный двоичный код с плавающей точкой IEEE-754 должен быть 384.64330964379240640482748858630657196044921875, но отображается значение 384.64330964379240681882947683334351.Я не понимаю, как возникла эта ценность.

...