std::cbrt的舍入误差
Rounding error of std::cbrt?
我想知道以下是否应该作为标准库的gcc实现中的错误报告。
对于所有无符号整数i
,如果我们将int(std::sqrt(i))
与该整数的实际平方根进行比较,转换总是得到好的结果。如果我们对std::cbrt
做同样的事情,情况就不是这样了:
// Problem of rounding of std::cbrt for i from 0 to 100 million
// i, exact cbrt(i), result of int(std::cbrt(i))
2197, 13, 12
17576, 26, 25
24389, 29, 28
140608, 52, 51
185193, 57, 56
195112, 58, 57
226981, 61, 60
1092727, 103, 102
1124864, 104, 103
1442897, 113, 112
1481544, 114, 113
1560896, 116, 115
1685159, 119, 118
1815848, 122, 121
8741816, 206, 205
8869743, 207, 206
8998912, 208, 207
9393931, 211, 210
9938375, 215, 214
11543176, 226, 225
11852352, 228, 227
12487168, 232, 231
12649337, 233, 232
13481272, 238, 237
13651919, 239, 238
14348907, 243, 242
14526784, 244, 243
14706125, 245, 244
69426531, 411, 410
69934528, 412, 411
70957944, 414, 413
71991296, 416, 415
72511713, 417, 416
73560059, 419, 418
74618461, 421, 420
75151448, 422, 421
79507000, 430, 429
88121125, 445, 444
89314623, 447, 446
91733851, 451, 450
92345408, 452, 451
92959677, 453, 452
94818816, 456, 455
99897344, 464, 463
您认为这应该作为缺陷报告吗?
std::cbrt
返回浮点类型(float, double等),但您将其转换为int
。这样的转换截断而不是四舍五入,例如0.9999变成0。虽然2197的立方根是一个整数似乎合乎逻辑,但由于浮点类型是以二进制存储的,因此并不总是可以完美地表示十进制数,并且在std::cbrt
执行的计算过程中可能会传播这种不准确性。例如,如果std::cbrt(2197) == 12.99999
(我的编译器不支持它,所以我不能检查实际值),那么通过将其转换为int
,您将截断值为12。
要纠正您的代码,在将std::cbrt(i)
转换为int
之前将其四舍五入。
相关文章:
- C++将浮点指针值舍入为小数位数
- Boost::posix_time::ptime舍入到给定的分钟数
- 浮点定向舍入和优化
- 为什么输出精度没有正确舍入?
- 使用设置精度时如何阻止数字向上舍入?
- 如何在使用 MPFR 时在提升多精度中设置舍入模式
- 定义范围,尽管C++舍入误差
- 舍入误差在DFT中给出不正确的tesult
- 如何在 +、-、* 和 / 中舍入误差后计算浮点精度
- 在C++中使用地板函数的舍入误差
- 浮点到双精度转换的舍入误差
- c++ linux x86_64中如何控制双精度计算以避免舍入误差
- 误差C++舍入数字 - 表达式必须具有整数或枚举类型
- R舍入误差与c++舍入误差
- "floor"是否有可能由于浮点舍入误差而返回不准确的结果?
- 射线平面相交:不准确的结果-舍入误差
- 浮点舍入误差
- C++、点和线在2D中的位置对舍入误差和位置具有鲁棒性
- C++中的舍入误差
- std::cbrt的舍入误差