打印浮点数具有意外值

时间:2019-01-17 04:52:29

标签: c++ io floating-point precision

为什么在下面的输出中将“ 32”添加到v的值?

int main()
{
    float v = 9.999e8;

    std::cout << "v --> " << v << std::endl;

    std::cout << std::fixed;
    std::cout << "v --> " << v << std::endl;

    return 0;
}

输出:

v --> 9.999e+08
v --> 999900032.000000
             ^^ 

是打印值的伪像,还是不能以浮点数精确表示9.999e + 08?

将v更改为两倍可以解决该问题,但我想了解实际原因。

强文本

2 个答案:

答案 0 :(得分:4)

使用` public function broadcastOn() { return new PrivateChannel('chat'); } ` IEEE 754 standard的通用桌面实现,只有24个有效位(和8个指数位)。这意味着在不损失精度的情况下,可以表示的最大连续值是2 24 ,大约是1.6E7(1.6•10 7 )。例如,这样的float不能准确地表示高于此阈值的奇数值,因为最低有效的1位“掉落”了表示。

您的值约为1E9(10 9 ),是60倍。这意味着该值可以约为30 off(四舍五入到最接近的可表示值之后)。请注意,指数位贡献2 exp (无需仔细考虑偏移量),而不贡献10 exp

使用float时有53位,足以容纳1E9(10 9 )。

答案 1 :(得分:2)

这是有限精度数学的本质。如果您尝试存储无法精确表示的值,那么充其量只能得到最接近的可表示值。

看看二进制文件:
999900032-> 111011100110010100001110000000
999900000-> 11101110011001010000110 11 00000

因此,准确表示此数字将需要两位额外的精度。大概是 <div id="dynamic_field"> <div class="row"> <div class="col s12" style="padding-top: 12px;"> <div class="col s12 m12 "><label for="title">Certificate Title</label> <textarea class="materialize-textarea" style="padding: 0px;" id="title" name="title[]">Higher School Secondary Certificate</textarea> </div> <div class="col s12 m12 "><label for="title">School / College, City</label> <textarea id="location" name="location[]" class="materialize-textarea" style="padding: 0px;"></textarea> </div> <div class="col s3 m3 "><label for="title">Marks</label> <input id="marks" name="marks[]" type="text" value="" /> </div> <div class="col s3 m3 "><label for="title">Division</label> <input id="divsion" name="divsion[]" type="text" value="" placeholder="1st" /> </div> <div class="col s3 m3 "><label for="title">Year</label> <select id="year" name="year[]"> <option value="2019" selected>2019</option> <option value="2018">2018</option> <option value="2017">2017</option> <option value="2016">2016</option> <option value="2015">2015</option> </select> </div> <div class="col s3 m3"><button type="button" name="addmoreEdu" id="addmoreEdu" class="btn btn-success pull-right" >Add More</button></div> </div> </div> </div> <script src="//code.jquery.com/jquery-3.3.1.min.js"></script>在您的系统上提供的。