c# – 具有相同输入的浮点错误
这有点奇怪.我在不同的时间为相同的代码位获得相同输入的不同输出.
这是一个非常简单的计算,只是在一个处理指南针类型的东西的类中,以度为单位得到一个给定角度的Radians. public double Radians { get { return this.heading_degrees * Math.PI / 180; } set { this.heading_degrees = value * 180 / Math.PI; normalize(); } } (heading_degrees是Compass类中的成员变量) get { //double hd = heading_degrees; double hd = 180.0; //double pi = Math.PI; double pi180 = 0.01745329251; //pi / 180; double result = hd * pi180; //double result = 3.14159265359; return result; //return heading_degrees * Math.PI / 180; } 正如你可以从注释掉的行中我尝试了不同的东西来尝试并深入到底. 我在两台计算机上尝试过这个,试图看看问题是否是环境问题,我还没有能够在不同的IDE上测试它(目前使用VS express 2012) 为极长的啰嗦道歉道歉. 其他说明: 更多测试: 如果获取代码是: get{ double result = 180.0d * 0.01745329251d; return result; } 结果是一致的.更准确. 如果获取代码是: get{ double hd = 180.0d; double result = hd * 0.01745329251d; return result; } 结果不一致. 如果我做: get{ double hd = 180.0d; double result = (float)(hd * 0.01745329251d); return result; } 结果是一致的,但精度较低. 请注意,在上面的测试中,变量都是getter的本地变量! 这看起来像黄金: 解决方法
不知道为什么我的脑子直接跳到发布与调试,但即使在同一个处理器上,硬件本身也是不一致的.
Is floating-point math consistent in C#? Can it be?简而言之,中间人可以在某些时候使用更高精度的值,根据事物被截断的时间产生不同的结果.
老答案: Float/double precision in debug/release modes 如果您需要高度一致的结果,您可能希望小数不是双倍的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |