gpt4 book ai didi

windows - 如何在 MacOs 或 Windows 系统中使用浮点扩展精度

转载 作者:可可西里 更新时间:2023-11-01 11:37:29 24 4
gpt4 key购买 nike

这段代码让我抓狂:

#include <stdio.h>

int main()
{
double x;
const double d=0.1;
x=d ;
for (int i=0; i<30; i++)
{
printf("Cycle %d Value :%.20e \n",i,x);
x=x*(double)11.-(double)10*d; //11*0.1 = 1.1 - 10*0.1 = 1 => 0.1

}
return 0;
}

事实上,由于内部表示,我试图证明一个病态案例 IEEE 754 标准中的 float 。在 MacOs 或 Windows 机器上,最终输出行将显示为:

第 29 周期值:1.28084153156127500000e+13

但在 Linux (Scientific Linux 5.4) 上,代码可以正常运行。阅读我发现:

On BSD systems such as FreeBSD, NetBSD and OpenBSD, the hardware double-precision rounding mode is the default, giving the greatest compatibility with native double precision platforms. On x86 GNU/Linux systems the default mode is extended precision (with the aim of providing increased accuracy).

在同一页GCC INTRO解释了如何在 Linux 系统上启用 double 舍入,但没有解释如何在其他系统上使用扩展精度。这可能在 MacOs 或 Windows 上吗?以及如何?

最佳答案

在 OS X 上使用扩展精度很简单:

x=11.L*x - 10.L*d;

L 后缀导致两个文字是 long double 而不是 double,这迫使整个表达式在根据 C 的表达式求值规则扩展 80 位。

除此之外,您的问题似乎有些困惑;你说“......在 Linux 上,代码可以毫无问题地运行。”几点:

  • OS X 结果和 Linux 结果都符合 IEEE-754 和 C 标准。其中任何一个都没有“问题”。
  • OS X 结果可在不支持(非标准)80 位浮点类型的硬件上重现。 Linux 结果不是。
  • 依赖于保留在 80 位扩展中的中间结果的计算是脆弱的;更改编译器选项、优化设置甚至程序流程都可能导致结果发生变化。 OS X 结果将在这些变化中保持稳定。

最后,您必须牢记浮点运算不是真正的运算。在 Linux 上获得的结果更接近用实数计算表达式时获得的结果这一事实并不会使该方法更好(或更糟)。

对于每一个自动使用扩展精度拯救了一个天真的浮点用户的案例,我可以向你展示一个案例,在这个案例中,评估模式的不可预测性引入了一个微妙且难以诊断的错误。这些通常被称为“精度过高”的错误;最近最著名的示例之一是允许用户将 2.2250738585072011e-308 放入 Web 表单并使服务器崩溃的错误。最终的原因恰恰是编译器落后于程序员并保持比它被指示的更高的精度。 OS X 不受此错误的影响,因为 double 表达式是以 double 计算的,而不是扩展的。

人们可以了解浮点运算的陷阱,只要系统既可重现又可移植。在 double 中评估 double 表达式和在 single 中评估单精度表达式提供了这些属性。使用扩展精度评估会破坏它们。在工具不可预测的环境中,您无法进行严肃的工程设计。

关于windows - 如何在 MacOs 或 Windows 系统中使用浮点扩展精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7681166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com