最近调试程序,发现一个奇怪问题,在测试样例时,有些样例有时出错,有时正确。仔细检查了程序,发现不是程序错误,最后只好对错误的情况,进行记录,然后调试,结果发现一个让人吃惊的问题,VS2010的编译器对于数值计算会犯一些数值分析所说的常见错误,例如我用command window调试发现了如下问题
>? f0
1020.0
>? f1 + f2- fjob
1024.0
>? f1 + f2 - fjob - f0
4.0
>? f1 + f2- f0 - fjob
0.0
值得指出的是,f1、f2和fjob的数值很大,超过了1e10级别,但是在double.maxValue的范围之内,按理说,这个应该是不会出问题的,但在实际计算中确出问题了,也就是说两个大级别的数加减会出现错误,有意思的是,后面一个也是大级别的数值计算,但没有出现数值错误,这个让人很奇怪。因而,不难推知,这与VS2010的数值计算的方法有关系,因而我们在进行数值计算时,遇到大级别数值计算时,一定要非常小心和谨慎。有时的错误并不来自于所编程序本身,而是所依赖的开发环境和编译平台。
VS2010 编译器的数值计算bug,布布扣,bubuko.com
时间: 2024-10-13 07:39:37