语言两个双精度浮点数相乘子程序_一个由跨平台产生的浮点数bug | 有你意想不到的结果...

问题背景 背景就简单点儿说,当初一个项目 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
补充说明ÿ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值