gpt4 book ai didi

c - strtof = strtod 后跟 cast?

转载 作者:太空狗 更新时间:2023-10-29 17:10:56 25 4
gpt4 key购买 nike

假设你有一个像“0.1”这样的字符串,它只能近似表示为二进制 float ,你想将它转换为单精度 float 。这可以作为

strtof(s, 0);

(float)strtod(s, 0);

直觉上,这些应该给出相同的结果,但直觉在所有情况下都是正确的吗?或者是否存在任何边缘情况,在这种情况下,通过进行两次舍入,第二种形式给出的结果与第一种形式略有不同?

最佳答案

strtodstrtof 的 C 标准规范未指定。它为 strtof 总是、经常或从不返回 (float)strtod 的可能性留下了空间。 ( This paragraph 指的是包含 that paragraph 的标准的另一部分,它说“结果是最近的可表示值,或者是与最近的可表示值紧邻的更大或更小的可表示值,以实现定义的方式选择”)。

strtodstrtof典型 实现分别返回最近的double 和最近的float 传递给它们的十进制表示。当这些函数以这种方式运行时,strtof(s, 0) 几乎总是(float)strtod(s, 0) 相同。它们不相同的十进制表示表示为 double-rounding problem ,因为首先将十进制表示舍入为 double 然后为 float 产生的结果与直接舍入为不同的结果 float 。请注意,发生这种情况时,strtof 结果是更准确的结果。中间舍入使误差略大于 ULP 的一半,而不是略小于 ULP 的一半。

在转换为 float 之前经过 double 时出现双舍入问题的十进制表示的一个示例是 1.01161128282547(取自 this quiz ) .最近的 double 恰好位于两个 float 的中间。直接舍入到 float 得到最近的 float,通过最近的 double 产生另一个 float

关于c - strtof = strtod 后跟 cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57307711/

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