VS2010 编译器的数值计算bug

最近调试程序,发现一个奇怪问题,在测试样例时,有些样例有时出错,有时正确。仔细检查了程序,发现不是程序错误,最后只好对错误的情况,进行记录,然后调试,结果发现一个让人吃惊的问题,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

VS2010 编译器的数值计算bug的相关文章

F#编译器的一个Bug

[<Struct>] typeTestStruct = val mutable _x:int new(x) = {_x = x} member this.Set(x) = this._x <- x member this.X with get() = this._x; let a = TestStruct(2) let c() = a.Set 10 a.X c();; 这里编译器不报错,但是执行c()的结果是2. 如果把[<Struct>]去掉,执行结果是10,这就正确了.

Fluent14.0配置VS2010编译器

udf配置VS2010编译器,一种比较简单方法是配置C:\Program Files\ANSYS Inc\v140\fluent\ntbin\win64\udf.bat文件: 1 @echo off 2 rem --- 3 rem MS Visual C++ 4 rem --- 5 set MSVC=D:\Program Files (x86)\Microsoft Visual Studio 10.0 6 set MSVC_VERSION=0 7 8 echo trying to find MS

ollvm 编译器优化的bug

近来用ollvm来编译一些代码,主要是需要对so进行一些混淆的操作,发现了一个bug,记录如下: 代码段1 jint begin_antidebug() {     pthread_t antidebugtid;     int ret = 0;     ret = pthread_create(&antidebugtid, NULL, antidebug_listen_thread, NULL);     if(ret!=0)     {         LOGANTI("Create

VS2010编译器工具cl对c++11标准支持情况测试

本文探讨了VS2010编译工具cl对C++11标准的支持情况,提供了利用C++11新特性的两段代码来进行测试,并同g++ 4.9.3编译器的编译情况相对比.总的说来:VS2010的编译器工具cl部分支持了C++11标准,而g++ 4.9.3则全部支持C++11标准.虽然现在已出现了C++14等新的标准,但熟悉了C++11标准的支持情况有利于我们正确选用符合自己需要的编译工具. 1. 问题产生 一个月前由于编写算法的而使用C++语言,看了一些英文版的算法设计和分析书.一个偶然的机会发现了C++11

更换 VS2010 编译器皮肤的方法

写在前面      最近的工作变动使自己的主要工作集中在Visual Studio的扩展开发上,其实这方面我已经关注和研究很长时间了,过程中发现了不少相关的资源,细到具体的技术方面:VSX,Vs.NET DSL, T4等,大到软件开发整的思想方面:领域驱动,模型驱动.当然也发现了不少开源软件,技术博客.Visual Studio Blog就是其中一个,虽然开博时间还不长,但它是Visual Studio开发团队的官方博客,主要会介绍IDE及其扩展.我会在以后的时间里同步这个博客介绍一个和大家开发

vc6.0 PK vs2010

从VC++6.0不足看VisualC++2010新特性 说起VC,有人想到维生素C(维C),有人想到风险投资(venture capital), 程序员们尤其是做底层开发的程序员或老程序员们第一感觉肯定会想到Visual C++6.0.为什么是6.0而不是其它的版本?这里的原因就不用我再多讲了,因为太经典了!这个经典已经有了10年的光荣历史,微软的Visual Studio系列也已经发展到了Visual Studio 2010.漫长的辉煌中Visual C++6.0也暴露出了一些问题,在这篇文章

Open Asset Import Library(assimp) vs2010编译

Assimp(Open Asset Import Library)是一个开源的3D模型导入解析库, 可以处理很多种3D文件格式:Collada, Blend, Obj, X, 3DS, LWO, MD5, MD2, MD3, MDL, MS3D等. 现在最新的版本是assimp-3.0. 下面是官方列出的一些特性: Reads more than 30 3D file formats, including Collada, X, 3DS, Blend, Obj Converts them to

VS2010与Matlab2010b混合编程

环境: 1.VS2010 2.MATLAB 2010b 3.WINDOW 7 (X64) 1.Matlab环境设置 要建立独立运行的C应用程序,系统中需要安装Matlab.Matlab编译器.C/C++编译器以及Matlab C/C++数学库函数和图形库函数.Matlab编译器使用mbuild命令可以直接将C/C++源代码编译为独立运行程序,在这些源代码中可以使用Matlab提供的接口来调用Matlab数学库函数.       虽然生成的可执行程序可以脱离Matlab环境运行,但是它需要Matl

【转】 vs2010项目属性配置

vs2010使用方案管理项目,一个解决方案下可包含多个项目. 默认情况下,项目属性的设置的目录起点为项目配置文件所在的位置,实际上就是项目头文件和源文件所在的位置. vs2010中默认建立C++项目,则解决方案总目录下包含一个sln和一个项目文件夹,在vs2010编译器中生成debug和release解决方案后,总目录下还会生成对应的debug和release目录,存放最终生成的exe或dll文件,同时也会在项目文件夹下生成debug和release目录(存放的是中间编译文件obj). 下面结合