当前位置: 首页 > 编程语言 > C#

为什么这个浮点数计算在不同的机器上给出不同的结果?分享

时间:2023-04-10 16:39:06 C#

这个浮点运算为什么在不同的机器上给出不同的结果?我有一个简单的例程,可以根据浮点值计算纵横比。因此,对于值1.77777779,例程返回字符串“16:9”。我在我的机器上测试过它并且工作正常。例程如下:publicstringAspectRatioAsString(floatf){boolcarryon=true;整数索引=0;双roundedUpValue=0;while(carryon){索引++;上浮动=索引*f;roundedUpValue=Math.Ceiling(上);if(roundedUpValue-upper20){car??ryon=false;}}返回roundedUpValue+":"+index;现在在另一台机器上我得到完全不同的结果。所以在我的机器上,1.77777779给出“16:9”,但在另一台机器上我得到“38:21”。从4.1.6节开始,这里有一个有趣的C#特性:浮点运算可以比运算结果类型更高的精度执行。例如,某些硬件体系结构支持“扩展”或“longdouble”浮点类型,它们具有比双精度类型更高的范围和精度,并使用这种精度更高的类型隐式执行所有浮点运算。只有在性能成本太高而无法使此类硬件体系结构以较低精度执行浮点运算时,而不是要求实现同时损失性能和精度,C#才允许将更高精度类型用于所有浮点运算。除了提供更精确的结果外,这很少有任何可衡量的影响。这可能是由于调用Ceiling而产生的“可衡量的影响”之一。正如其他人所指出的那样,取浮点数的上限将差异0.000000002放大9个数量级,因为它将15.99999999变成16,将16.00000001变成17。两个数字在操作前略有不同后差异很大相同;不同的机器在其浮点运算中或多或少具有“额外精度”这一事实可以解释微小的差异。一些相关问题:为了解决您关于如何从浮点数计算纵横比的具体问题:我可能会以完全不同的方式处理这个问题。我会制作一个这样的表:structRatio{publicintX{get;私有集;}publicintY{得到;私有集;}publicRatio(intx,inty):this(){this.X=x;这个.Y=y;}publicdoubleAsDouble(){return(double)X/(double)Y;}}Ratio[]commonRatios={newRatio(16,9),newRatio(4,3),//...等等,也许这里有几百个最常见的比率。//因为您将结果固定为小于20,所以不可能//超过几百。};现在你的实现是publicstringAspectRatioAsString(doubleratio){varresults=fromcommonRatioincommonRatiosselectnew{Ratio=commonRatio,Diff=Math.Abs??(ratio-commonRatio.AsDouble())};varsmallestResult=results.Min(x=>x.Diff);returnString.Format("{0}:{1}",smallestResult.Ratio.X,smallestResult.Ratio.Y);请注意代码现在看起来与您正在尝试做的非常相似:从这个公比列表中,选择一个最小化给定比率和公比之间的差异的那个。除非我真的必须,否则我不使用花车。由于舍入误差,他们很容易出现这种情况。您可以更改代码以使用双精度吗?(小数点太过分了)。如果你这样做,它会给出更一致的结果吗?至于为什么在不同的机器上不一样,两个机器有什么区别?像这样的事情可能是原因。试试Math.Round而不是Math.Ceiling。如果您以16.0000001结束并四舍五入,您将错误地丢弃该答案。杂项附加建议:修改(未测试):publicstringAspectRatioAsString(doubleratio){for(intheight=1;height当index为9时,你可能会得到类似于upperbound=16.0000001或upperbound=15.9999999的东西。你得到哪个会取决于舍入误差,在不同的机器上可能会有所不同。当它是15.999999时,roundedUpValue-upper为真,循环结束。当它是16.0000001时,roundedUpValue-upper为假,继续循环,直到得到index>20。而不是,也许你应该尝试将上部四舍五入到最接近的整数,并检查它与该整数的差的绝对值是否很小。换句话说,使用if(Math.Abs??(Math.Round(upper)-upper)20)The以上就是C#学习教程:为什么这个浮点运算在不同的机器上给出不同的结果?所有的内容分享,如果对大家有用,需要详细了解C#学习教程,希望大家多多关注————本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: