Расширенная двойная точность - PullRequest
6 голосов
/ 09 февраля 2012

Можно ли получить более 16 цифр с точностью double без использования quadruple? Если это возможно, это зависит от компилятора или чего-то еще? Потому что я знаю, что кто-то сказал, что он работал с точностью double и с точностью до 22 цифр.

Ответы [ 2 ]

6 голосов
/ 09 февраля 2012

Тип данных double precision проистекает из Fortran 77, и единственное требование к этому типу состоит в том, что он имеет большую точность, чем real. Ты не должен больше этим пользоваться.

В Fortran 90/95 и выше поддерживаются как минимум два размера действительных чисел. Точность определяется параметром kind, значение которого зависит от компилятора.

real(kind=8) :: a, b

Чтобы иметь переносимый способ определения точности, вы можете получить значение kind, которое допускает определенную точность, используя:

integer, parameter :: long_double = SELECTED_REAL_KIND(22)

тогда вы можете объявить свои переменные как

real(kind=long_double) :: a, b

но не уверен, что ваш компилятор будет поддерживать эту точность, и в этом случае функция SELECTED_REAL_KIND будет возвращать отрицательное число.

см. Также этот пост

5 голосов
/ 09 февраля 2012

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

Если вы хотите использовать встроенную функцию SELECTED_REAL_KIND и оптимизировать ее для своего конкретного компилятора и аппаратного обеспечения, вы можете поэкспериментировать. Некоторые комбинации обеспечат квадрупольную точность в программном обеспечении, которая будет медленной. Компилятор с двойной точностью и 10-байтовой расширенной точностью обеспечит этот более длинный тип с помощью selected_real_kind (17). Компилятор, который имеет двойную точность и четырехкратную точность, но не имеет расширенной точности 10 байт, обеспечит квадрупольную точность с помощью selected_real_kind (17) или selected_real_kind (32). (Я не знаю ни одного компилятора, который бы поддерживал как 10-байтовое расширение, так и квадруполь.) Компилятор, которому не хватает квадрупольной точности, вернет -1 для selected_real_kind (32).

...