C的精度为double:编译器依赖?

时间:2010-04-05 13:01:41

标签: c compiler-construction precision

在我的32位机器上(带有Intel T7700 duo内核),对于C语言,我有15个精确数字,用于双重和长双重类型。我比较了LDBL_DIG用于long double和DBL_DIG用于double,它们都是15.我使用MVS2008得到了这些答案。我想知道这些结果是否可以依赖于编译器,还是只依赖于我的处理器?

非常感谢...

5 个答案:

答案 0 :(得分:1)

他们可能依赖编译器,但总的来说,他们只依赖于架构。如果编译器使用相同的包含文件,特别是这些可能不会改变。如果你想编写可移植的代码,最好检查一下它们。

答案 1 :(得分:1)

右。这些是依赖于实现的。 C标准的唯一保证是:

  1. floatdouble的子集,doublelong double的子集(6.2.5 / 10)
  2. FLT_RADIX ≥ 2(5.2.4.2.2 / 9)
  3. FLT_DIG ≥ 6, DBL_DIG ≥ 10, LDBL_DIG ≥ 10
  4. FLT_MIN_10_EXP, DBL_MIN_10_EXP LDBL_MIN_10_EXP ≤ -37
  5. FLT_MAX_10_EXP, DBL_MAX_10_EXP, LDBL_MAX_10_EXP ≥ +37
  6. FLT_MAX, DBL_MAX, LDBL_MAX ≥ 1e+37(5.2.4.2.2 / 10)
  7. FLT_EPSILON ≤ 1e-5, DBL_EPSILON ≤ 1e-9, LDBL_EPSILON ≤ 1e-9(5.2.4.2.2 / 11)
  8. FLT_MIN, DBL_MIN, LDBL_MIN ≤ 1e-37
  9. C标准允许对待long double = double

答案 2 :(得分:1)

有些编译器支持长双精度格式,其精度高于双精度。 Microsoft MSVC不是其中之一。如果15位有效数字不够好,那么首先你不应该使用浮点类型的几率非常高。检查this thread是否有任意精度库。

答案 3 :(得分:1)

虽然C标准不要求这样做,但强烈建议floatdouble分别是标准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计算。