2014-03-13 60 views
0

当使用REAL(KIND = 16)或REAL * 16时,我的程序有一些精度问题。有没有办法比精确度更高?如何创建REAL(KIND = 32)变量?

+1

所有当前的Fortran编译器都支持32位和64位浮点数。有些还支持其他尺寸。请参阅http://stackoverflow.com/questions/22362211/confusing-double-precision-real-in-fortran的答案以获取有关如何为变量指定类型的指导。 –

+2

real(N)与real * N不同,不应使用。见http://stackoverflow.com/questions/3170239/fortran-integer4-vs-integer4-vs-integerkind-4和http://stackoverflow.com/questions/22362211/confusing-double-precision-real-in-fortran –

回答

1

REAL*32(种类值不是直接携带的)将是一个256位的real。没有这种IEEE浮点类型。见http://en.wikipedia.org/wiki/IEEE_floating-point_standard

我不知道支持这种类型的任何处理器(编译器)作为扩展。另外,我没有知道硬件是如何处理这个本地的。

在如此高的精度下,我会重新考虑算法及其稳定性。程序通常不需要四分之一(你的16字节)的精度。即使是双倍通常也足够了。我以单精度进行了很多计算。

最后,有一些库支持更高的精度,但它们的使用比用不同类型参数重新编译更复杂。见

http://crd-legacy.lbl.gov/~dhbailey/mpdist/

Is there an arbitrary precision floating point library for C/C++ which allows arbitrary precision exponents?


在一个特殊的要求:一种数字是依赖于实现的。种类16可能不存在或可能不表示IEEE 128位浮点数。在这里看到很多问题 Fortran: integer*4 vs integer(4) vs integer(kind=4) Fortran 90 kind parameter What does `real*8` mean?等等。

+0

我从来没有这样做,但再次重复相同的单词很累人。这个问题的意图是完全清楚的。至少在存储大小上,REAL * 16是唯一的,事实上在我知道的所有系统上都是IEEE 128位浮点型。它始终是16个字符的实际变量 - 16个字节,尽管非标准。 –