当使用IEEE 754浮点表示(c ++中的double
类型)时,非常接近(可表示)整数的数字将四舍五入到它们最接近的整数并准确表示。这是真的吗?
在舍入之前,数字到底是多么接近最接近的可表示整数?
这个距离是否恒定?
例如,假设1可以准确表示,那么最小double
小于1是什么?
答案 0 :(得分:6)
使用IEEE 754浮点表示(
double
类型时 c ++),非常接近(可表示)整数的数字是 四舍五入到最接近的整数并完全表示。
这取决于数字是否更接近整数而不是其他可表示的值。 0.99999999999999994
is not equal to 1
, but 0.99999999999999995
is.
这个距离是否恒定?
不,它在更大的范围内变得更小 - 特别是在表示中具有更大的指数。较大的指数意味着尾数覆盖较大的间隔,这反过来意味着整体精度较低。
例如,什么是小于1的最大双倍?
std::nexttoward(1.0, 0.0)
。例如。 0.999999999999999889
on Coliru
答案 1 :(得分:2)
你会发现更多关于1.0的相反方向的明确陈述 这里记录了1.0和下一个更大数字之间的差异:
std::numeric_limits<double>::epsilon()
浮点的工作方式,下一个较小的数字应该与下一个较大的数字正好相差一半。
答案 2 :(得分:2)
第一个低于1的IEEE双数可以明确地写为0.99999999999999989,但正好是0.99999999999999988897769753748434595763683319091796875。
距离不常数,它取决于数字的指数(以及数量)。最终差距变得大于1,这意味着偶数(不是奇数 - 奇数整数是第一个得到舍入的整数)整数将稍微变圆(或者最终变得很多)。
答案 3 :(得分:0)
增加IEEE浮点数的二进制表示可以看作是递增的整数表示:
示例Hack(英特尔):
#include <cstdint>
#include <iostream>
#include <limits>
int main() {
double one = 1;
std::uint64_t one_representation = *reinterpret_cast<std::uint64_t*>(&one);
std::uint64_t lesser_representation = one_representation - 1;
std::cout.precision(std::numeric_limits<double>::digits10 + 1);
std::cout << std::hex;
std::cout << *reinterpret_cast<double*>(&lesser_representation)
<< " [" << lesser_representation
<< "] < " << *reinterpret_cast<double*>(&one_representation)
<< " [" << one_representation
<< "]\n";
}
输出:
0.9999999999999999 [3fefffffffffffff] < 1 [3ff0000000000000]
当将整数表示推进到其极限时,如果指数位发生变化,则连续浮点数的差异会增加。
另请参阅:http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
答案 4 :(得分:-2)
当使用IEEE 754浮点表示(c ++中的double类型)时,非常接近精确整数的数字将四舍五入为最接近的整数并准确表示。这是真的吗?
这是假的。
在舍入之前,数字到最近的int到底有多接近?
当您进行二进制到字符串转换时,浮点数将四舍五入为当前精度(对于printf
系列函数,默认精度为6)使用当前舍入模式。