当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 求高手!!windows与linux的浮点数的问题
帖子发表于 : 2013-03-14 16:35 

注册: 2007-06-02 20:00
帖子: 294
送出感谢: 5
接收感谢: 2
同样的一个程序,纯数学计算的,没有什么api,在windows和linux都使用g++编译,为什么结果不一样??


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 求高手!!windows与linux的浮点数的问题
帖子发表于 : 2013-03-14 16:36 

注册: 2007-06-02 20:00
帖子: 294
送出感谢: 5
接收感谢: 2
上程序
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#define pf(i,s,t) for (int (i)=s;(i)<(t);(i)++)
#define mf(i,s,t) for (int (i)=s;(i)<(t);(i)--)
#define mt(a,d) memset((a),(d),sizeof(a))
using namespace std;
main()
{
   long long x,y,n;
   cin>>x>>y>>n;
   double k=x/(y*1.0);
   double min=100;
   long long a,b;
   int minb=1000000;
   for (long long i=1;i<=n;i++)
   {
      long long z=(long long)floor(i*k);
      if (min>fabs((i*x-y*z)*1.0/(y*i)))
      {
         min=fabs((i*x-y*z)*1.0/(y*i));
         a=z;
         b=i;
      }
      z++;
      if (min>fabs((i*x-y*z)*1.0/(y*i)))
      {
         min=fabs((i*x-y*z)*1.0/(y*i));
         a=z;
         b=i;
      }
   }
   cout<<a<<'/'<<b<<endl;
   return 0;
}


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 求高手!!windows与linux的浮点数的问题
帖子发表于 : 2013-03-14 16:37 

注册: 2007-06-02 20:00
帖子: 294
送出感谢: 5
接收感谢: 2
输入38133 49787 9840
linux输出是3295/4302
windows输出却是6590/8604


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 求高手!!windows与linux的浮点数的问题
帖子发表于 : 2013-03-15 11:19 
头像

注册: 2008-12-24 12:02
帖子: 108
送出感谢: 1
接收感谢: 4
這應該不是 OS 的原因。應該是你用的 ia32 版的 windows 和 x86-64 版的 linux, 所以 g++ 的 target 不同了。所以產生的 asm instruction 也不同,不同指令的精度產生了這個問題。
第一次迴圈過後兩者沒什麼不同。但第二次迴圈時。 z++ 後,照理 if 條件是爲真的。但只在 i386 下爲真, x86-64 機器上就不會真。主要就是 asm instruction 的精度原因。

在爲 ia32 產生組合碼時,用的是 fpu 來進行浮點計算和比較。而 Linux(Windows 應該也是如此) 不管在 ia32/x86-64 都是設 fpu 的精度爲擴展精度(fpu 有單精度,雙精度,擴展精度可調),也就是 80bit 的精度來計算的。你用的 double, 64bit 會自動被 fpu 轉換爲 80bit 的浮點數來進行存儲,計算,存放結果。

x86-64 保證有 sse 指令擴展可用。 gcc 生成的 asm 就用那些指令來計算。但存儲,計算,結果的精度只有 32/64bit(ss/sd 後綴)。所以在 x86-64 上, gcc 生成的浮點計算代碼的精度反而比 ia32 下小了。因爲精度原因,原本 min > ... ,結果 min = ... 不成立。

這樣巨大的精度丟失(80-64=16bit),gcc 開發者居然是接受的,我也不知道他們是怎麼想的。
這類問題,最好還是用分數庫來計算吧,浮點數,不管如何,都存在精度問題的。


_________________
機器生命



_________________
评价: 3.7% wgj
 
页首
 用户资料  
 
5 楼 
 文章标题 : Re: 求高手!!windows与linux的浮点数的问题
帖子发表于 : 2013-03-16 13:18 

注册: 2007-06-02 20:00
帖子: 294
送出感谢: 5
接收感谢: 2
多谢楼上。看来跨平台真是个令人痛苦的事情。。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译