浮动分数精度

Jon*_*Mee 4 c++ floating-point

如何精确很多地方没有一float间拥有1.0f0.0f使得每个值可以被唯一代表?

例如,如果第一个小数float不能代表0.13f答案,则浮点只有1个精度位.

Sur*_*urt 7

std::numeric_limits<float>::digits10
Run Code Online (Sandbox Code Playgroud)

来自http://en.cppreference.com/w/cpp/types/numeric_limits/digits10

标准的32位IEEE 754浮点类型具有24位小数部分(写入23位,一个暗示),这可能表明它可以表示7位小数(24*std :: log10(2)是7.22),但是相对舍入误差是不均匀的,一些带有7位十进制数字的浮点值不能保持转换为32位浮点数和返回值:最小的正例是8.589973e9,在往返后变为8.589974e9.这些舍入误差在表示中不能超过一位,而数字10计算为(24-1)*std :: log10(2),即6.92.四舍五入导致值为6.

Edit2:这表示该数​​字不是7,而是任何浮点数只有6位数,就像std::numeric_limits<float>::digits10调用所说的那样.

float orgF = 8.589973e9;
int i = orgF;
float f = i;
assert(f == orgF);
Run Code Online (Sandbox Code Playgroud)

在往返改变值时失败.

因此,如果我们只查找介于1.0和0.0之间的数字,则肯定答案是7,因为有问题的最低正数是8.589973e9.