gpt4 book ai didi

c++ - 将十进制数截断为最接近的 4 位小数并断言

转载 作者:行者123 更新时间:2023-11-30 02:23:35 26 4
gpt4 key购买 nike

如何将一个小数点后 4 位的 float 四舍五入并在 assert 中使用?我正在通过两种方法计算样本的平均值,并想通过断言来比较它们。由于小数点后 6 位的平均值不同(这没问题),我得到一个断言错误。

是否可以截断最后 2 个小数点或者只接受前 4 个小数点。

如我所见,std::precision 等大多数命令用于输入输出操作。 std::numeric_limits 的意义是什么?

我有一个解决方法,当我将 float 乘以 10000 并将该数字取底时。这行得通,但适当的解决方案会有所帮助。

float  mean, mean_x;
mean = 1.123456;
mean_x = 1.123499;
assert(std::floor(mean*10000) == std::floor(mean_x*10000));

最佳答案

您不能将 float 四舍五入到特定精度作为小数位数,因为在内部 float 值是 ∑ (bi/2i) i 的值对于 float 为 1..24(当平台确实使用 IEEE 754 标准浮点实现时)。因此,例如 1/1024 = 0.0009765625 => 您可能需要这个来通过 cca 调整小数点后第四位。 +-9,但它还会在第四位之后添加更多的小数位。

这就是为什么将 OUTPUT 格式化(四舍五入)为特定数量的十进制数字,但值保持不变。

在单元测试中,通常有专门用于浮点值比较的特殊断言,它有进一步的参数 epsilon,指定要容忍的最大值差异(在您的情况下 1e-4 就可以)。

如果你不使用一些具有广泛断言的单元测试框架,你可以使用史蒂夫的建议(这是这种 float 断言的实现):

// assert that the difference is smaller than 0.0001
assert(std::abs(mean - mean_x) < 1e-4); // (abs from cmath)

有关 float 工作原理的相关文档(在大多数平台上): What Every Programmer Should Know About Floating-Point Arithmetic

关于c++ - 将十进制数截断为最接近的 4 位小数并断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46098262/

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