gpt4 book ai didi

c - C float 是不确定的吗?

转载 作者:太空狗 更新时间:2023-10-29 16:38:31 24 4
gpt4 key购买 nike

我在某处读到,C double float 中存在非确定性来源,如下所示:

  1. C 标准规定 64 位 float ( double )只需要产生大约 64 位精度。

  2. 硬件可以在 80 位寄存器中进行浮点运算。

  3. 由于 (1),C 编译器不需要在将 double 值填充到高位之前清除浮点寄存器的低位。

  4. 这意味着 YMMV,即结果可能会出现微小差异。

是否有任何现在常见的硬件和软件组合会真正发生这种情况?我在其他线程中看到 .net 有这个问题,但是 C 通过 gcc 可以加倍吗? (例如,我正在测试基于完全相等的逐次逼近的收敛性)

最佳答案

在大多数(如果不是所有)情况下,标准严格规定了您所关心的问题,即过高精度实现的行为。结合 IEEE 754(假设您的 C 实现遵循附件 F),这不会为您似乎要询问的各种非确定性留出空间。特别是,像 x == x(Mehrdad 在评论中提到的)这样的事情失败是被禁止的,因为有关于何时在表达式中保留超精度以及何时丢弃它的规则。对对象的显式强制转换和赋值是降低过度精度并确保您使用标称类型的操作之一。

但是请注意,仍然有很多不符合标准的损坏的编译器。 GCC 故意忽略它们,除非您使用 -std=c99-std=c11(即在这方面故意破坏“gnu99”和“gnu11”选项)。在 GCC 4.5 之前,甚至不支持正确处理超精度。

关于c - C float 是不确定的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24339868/

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