本文为 6 年前的旧文整理重发,因为最开始是 workdpress 的程序,后改为静态 blog 过程中,导致格式等混乱,这篇年久失修旧文可文末点击原文访问。
问题背景
背景就简单点儿说,当初一个项目 C# 编写,涉及浮点运算,来龙去脉省去,直接看如下代码。(为什么有这个问题产生,是因为当初线上产生了很诡异的问题,和本地调试效果不一致。)
float p3x = 80838.0f;
float p2y = -2499.0f;
double v321 = p3x * p2y;
Console.WriteLine(v321);
很简单吧,马上笔算下结果为 -202014162,没问题,难道C#没有产生这样的结果?不可能吧,开启 VisualStudio,copy代码试试,果然结果是-202014162。就这样完了么?显然没有!把编译时的选项从AnyCPU改成x64试试~(服务器环境正是64位滴哦!!)结果居然变成了-202014160,对没错,就是-202014160。细想一下,因为浮点运算的误差,-202014160 这个结果是合理的。嗯,再试试C++。// 测试环境Intel(R) i7-3770 CPU, windows OS 64. Visual Studio 2012 默认设置。
float p3x = 80838.0f;
float p2y = -2499.0f;
double v321 = p3x * p2y;
std::cout.precision(15);
std::cout << v321 << std::endl;
呃,好像x86、x64都是这个合理的结果 -202014160。奇了个怪了。其实上面这段C++代码在不同的平台下的结果如下:
Windows 32/64位下:-202014160
Linux 64位下(CentOS 6 gcc 4.4.7):-202014160
Linux 32位下(Ubuntu 12.04+ gcc 4.6.3)是:-202014162
补充说明:当初这篇文章投稿到酷壳,著名程序员左耳朵耗子那边&#