在我的32位机器上(带有Intel T7700 duo内核),对于C语言,我有15个精确数字,用于双重和长双重类型。我比较了LDBL_DIG用于long double和DBL_DIG用于double,它们都是15.我使用MVS2008得到了这些答案。我想知道这些结果是否可以依赖于编译器,还是只依赖于我的处理器?
非常感谢...
答案 0 :(得分:1)
他们可能依赖编译器,但总的来说,他们只依赖于架构。如果编译器使用相同的包含文件,特别是这些可能不会改变。如果你想编写可移植的代码,最好检查一下它们。
答案 1 :(得分:1)
右。这些是依赖于实现的。 C标准的唯一保证是:
float
是double
的子集,double
是long double
的子集(6.2.5 / 10)FLT_RADIX ≥ 2
(5.2.4.2.2 / 9)FLT_DIG ≥ 6, DBL_DIG ≥ 10, LDBL_DIG ≥ 10
FLT_MIN_10_EXP, DBL_MIN_10_EXP LDBL_MIN_10_EXP ≤ -37
FLT_MAX_10_EXP, DBL_MAX_10_EXP, LDBL_MAX_10_EXP ≥ +37
FLT_MAX, DBL_MAX, LDBL_MAX ≥ 1e+37
(5.2.4.2.2 / 10)FLT_EPSILON ≤ 1e-5, DBL_EPSILON ≤ 1e-9, LDBL_EPSILON ≤ 1e-9
(5.2.4.2.2 / 11)FLT_MIN, DBL_MIN, LDBL_MIN ≤ 1e-37
C标准允许对待long double = double
。
答案 2 :(得分:1)
有些编译器支持长双精度格式,其精度高于双精度。 Microsoft MSVC不是其中之一。如果15位有效数字不够好,那么首先你不应该使用浮点类型的几率非常高。检查this thread是否有任意精度库。
答案 3 :(得分:1)
虽然C标准不要求这样做,但强烈建议float
和double
分别是标准IEEE 754单精度和双精度浮点类型。它们适用于任何支持硬件的架构(几乎无处不在)。
对于long double
来说,事情稍微有些棘手,因为没有多少架构支持高于双精度的浮点类型。该标准要求long double
的范围和精度至少与double
一样多。这意味着如果架构不支持更多内容,long double
类型与double
相同。即使它 (如x87),一些编译器仍然使long double
等同于double
(如M $ VC),而其他编译器则将扩展精度类型公开为{{ 1}}(如Borland和GCC)。
即使编译器公开扩展精度类型,仍然没有关于“extended-precision”的含义的标准。在x87上,这是80位。其他一些架构具有128位四精度类型。即使在x87上,一些编译器的long double
= 10,而其他编译器将其填充以进行对齐,因此它为12或16(如果sizeof(long double)
为long double
,则为8)。
所以最重要的是,double
的实施因平台而异。您唯一可以确定的是,至少等同于long double
。如果要编写可移植代码,请不要依赖其表示 - 远离接口和二进制I / O.在程序的内部计算中使用double
是可以的。
答案 4 :(得分:0)
您还应该知道某些CPU的浮点单元支持中间结果的多个精度级别,并且可以在运行时控制此级别。应用程序受到了错误的DirectX库版本的影响,在库调用期间选择较低的精度并忘记恢复设置,从而影响调用者的后续FP计算。