搜索
bottom↓
回复: 19

VS2015:目标平台在x86和x64下double计算问题

[复制链接]

出100入0汤圆

发表于 2021-5-25 17:00:54 | 显示全部楼层 |阅读模式
本帖最后由 wochai 于 2021-5-25 18:38 编辑

C#代码如下:   
             int AngleSweep = 360;
            double SequenceDisplayMin = 737933.5;
            double SequenceDisplayMax = 737934;
            float[] m_TrackValue = new float[2] { 737933,0.6378019f};
            //结果应为99.21736802905798, x64和Any CPU下实际计算结果为90,x86下正常
            double Angle = AngleSweep * (m_TrackValue[0] + m_TrackValue[1] - SequenceDisplayMin) / (SequenceDisplayMax - SequenceDisplayMin);
            //结果始终正确
            Angle = 360 * (737933 + 0.6378019 - SequenceDisplayMin) / (SequenceDisplayMax - SequenceDisplayMin);


???????????????

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出100入0汤圆

 楼主| 发表于 2021-5-25 17:01:46 | 显示全部楼层
int AngleSweep = 360;
            double SequenceDisplayMin = 737933.5;
            double SequenceDisplayMax = 737934;
            float[] m_TrackValue = new float[2] { 737933,0.6378019f};
            //这样始终正常正常
            double Angle = AngleSweep * ((double)m_TrackValue[0] +(double) m_TrackValue[1] - SequenceDisplayMin) / (SequenceDisplayMax - SequenceDisplayMin);
            //结果始终正确
            Angle = 360 * (737933 + 0.6378019 - SequenceDisplayMin) / (SequenceDisplayMax - SequenceDisplayMin);

出300入477汤圆

发表于 2021-5-25 18:25:23 来自手机 | 显示全部楼层
一个简单的规则:除非是纯整数运算并且你知道你希望对除法取整,否则应当手工写类型强转,全转成double来做计算。

出300入477汤圆

发表于 2021-5-25 18:27:40 来自手机 | 显示全部楼层
你错在m_TrackValue[0] + m_TrackValue[1]
两个float相加的结果是float,丢了精度
手工带上强转double就对了

出100入0汤圆

 楼主| 发表于 2021-5-25 18:30:23 | 显示全部楼层
redroof 发表于 2021-5-25 18:27
你错在m_TrackValue[0] + m_TrackValue[1]
两个float相加的结果是float,丢了精度
手工带上强转double就对 ...


整个算式中有double类型,理论上应该自动提升的!
而且在目标平台x86下是正常的!

出100入0汤圆

 楼主| 发表于 2021-5-25 18:38:50 | 显示全部楼层
前面忘写了,是C# 2015

出300入477汤圆

发表于 2021-5-25 19:03:42 来自手机 | 显示全部楼层
wochai 发表于 2021-5-25 18:30
整个算式中有double类型,理论上应该自动提升的!
而且在目标平台x86下是正常的! ...

你不该依赖这个。
2个float再加一个double,前两个是float加float,不一定会提升,这俩的结果加上double,这个时候才保证会提升。

出0入0汤圆

发表于 2021-5-25 19:15:31 | 显示全部楼层
学到了个新知识

搜 C# double float x86 x64 能找到不少东西,比如这篇:
C#因x86-x64环境不同引发的浮点”bug”~

出0入0汤圆

发表于 2021-5-25 19:17:16 | 显示全部楼层
我自己不管是写 C 还是 C# 程序,能用 double 都不会用 float, float 的范围还是有点小了

出0入8汤圆

发表于 2021-5-25 19:58:58 来自手机 | 显示全部楼层
float精度只有6~7位有效数字。要求高精度,必须手动确保double类型

出10入284汤圆

发表于 2021-5-25 23:05:44 来自手机 | 显示全部楼层
说一个很少有人注意的,FPU是80位的,所以最好的数据类型是float128。double也会导致精度损失,只是一般人没发现而已

出100入0汤圆

 楼主| 发表于 2021-5-26 09:05:42 | 显示全部楼层
wudicgi 发表于 2021-5-25 19:15
学到了个新知识

搜 C# double float x86 x64 能找到不少东西,比如这篇:

是的,一直用的x86目标平台,前两天才因为一个DLL的原因使用x64目标平台,一下把我搞蒙了.

出100入0汤圆

 楼主| 发表于 2021-5-26 09:07:34 | 显示全部楼层
brother_yan 发表于 2021-5-25 23:05
说一个很少有人注意的,FPU是80位的,所以最好的数据类型是float128。double也会导致精度损失,只是一般人 ...

精度丢失可以理解.
以前还专门买过一本计算方法的书,里面就提到了如何通过改变计算方法以避免精度问题造成的计算错误.

出100入0汤圆

 楼主| 发表于 2021-5-26 09:08:24 | 显示全部楼层
liwei_jlu 发表于 2021-5-25 19:58
float精度只有6~7位有效数字。要求高精度,必须手动确保double类型

是的.
主要是x86正常影响了我的判断.

出100入0汤圆

 楼主| 发表于 2021-5-26 09:09:55 | 显示全部楼层
wudicgi 发表于 2021-5-25 19:17
我自己不管是写 C 还是 C# 程序,能用 double 都不会用 float, float 的范围还是有点小了
...

我这因为是一个较大的数组,还需要保存,所以采用了float来减少尺寸.

出100入0汤圆

 楼主| 发表于 2021-5-26 09:10:24 | 显示全部楼层
redroof 发表于 2021-5-25 19:03
你不该依赖这个。
2个float再加一个double,前两个是float加float,不一定会提升,这俩的结果加上double ...

是的,吃一堑长一智.

出300入477汤圆

发表于 2021-5-26 10:09:28 来自手机 | 显示全部楼层
brother_yan 发表于 2021-5-25 23:05
说一个很少有人注意的,FPU是80位的,所以最好的数据类型是float128。double也会导致精度损失,只是一般人 ...

x87的内部数据类型就是这种,某些编译器可以用 long double 来明确表示这种数据类型。
但是x64上面默认是用SSE的,而不是x87,所以默认没有这种了。
x87比SSE慢,而且不灵活,基本上该淘汰了,除非你需要这一点多岀来的精度。double一般都够用了,明显不够的场合你多这一点也还是不够。

出300入477汤圆

发表于 2021-5-26 10:10:44 来自手机 | 显示全部楼层
wochai 发表于 2021-5-26 09:09
我这因为是一个较大的数组,还需要保存,所以采用了float来减少尺寸.

存储可以是float,但是所有的计算应该明确的用double来做。

出0入16汤圆

发表于 2021-5-26 10:33:52 | 显示全部楼层
C#的强制转换和Convert.ToXX是不一样的,尽量不要用强制转换,Single与float也有点不一样

出10入284汤圆

发表于 2021-5-26 11:40:34 来自手机 | 显示全部楼层
redroof 发表于 2021-5-26 10:09
x87的内部数据类型就是这种,某些编译器可以用 long double 来明确表示这种数据类型。
但是x64上面默认是 ...

测试了一下,确实这样,看来我知识要更新了,多谢!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 17:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表