- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个我无法理解的简单乘法问题...我正在使用 .Net Framework 4,并在 x86 中构建。我正在执行以下代码:
double x = 348333.673899683;
double y = 4521014.98461396;
double aux = x * y;
aux 的期望值是1574821759346,09949827752137468(我用一个简单的计算器计算过)。但是,我在 aux 中获取的值是 1574821822464。请注意,这不是精度错误,即使是整数部分也已更改。
如果我在乘法中放置一个断点并将鼠标悬停在 de * 运算符上,我会看到 x * y = 1574821759346.0994 没问题。如果我将鼠标悬停在 aux 变量上,我会看到 aux = 1574821822464
为了把最后一段说清楚,可以看下面两张图:
首先,我认为这可能是因为 x86 编译,但阅读下一篇文章后,我放弃了这个选项:
The Double Byte Size in 32 bit and 64 bit OS
我不明白这里发生了什么。任何帮助将不胜感激。
---编辑更多信息---
我正在使用 VS2015。我又添加了三行来调试它:
log.Info(x);
log.Info(y);
log.Info(aux);
为了显示日志,我正在使用库 log4net。输出是:
23322 [8] INFO Art.Model.Scenarios (null) - 348333,673899683
24745 [8] INFO Art.Model.Scenarios (null) - 4521014,98461396
26274 [8] INFO Art.Model.Scenarios (null) - 1574821822464
所以这不是调试器中的错误。如果我创建一个全新的项目和解决方案,它工作正常,但我不明白为什么不能在这个解决方案中工作。
---第二次编辑---
感谢评论,我尝试了一些新东西:
double x = 348333.673899683;
double y = 4521014.98461396;
double aux = x * y;
decimal xx = 348333.673899683m;
decimal yy = 4521014.98461396m;
decimal auxx = xx * yy;
log.Info(x);
log.Info(y);
log.Info(aux);
log.Info(xx);
log.Info(yy);
log.Info(auxx);
结果是:
16129 [8] INFO Art.Model.Scenarios (null) - 348333,673899683
16145 [8] INFO Art.Model.Scenarios (null) - 4521014,98461396
16145 [8] INFO Art.Model.Scenarios (null) - 1574821822464
16145 [8] INFO Art.Model.Scenarios (null) - 348333,673899683
16145 [8] INFO Art.Model.Scenarios (null) - 4521014,98461396
16145 [8] INFO Art.Model.Scenarios (null) - 1574821759346,0994982775213747
因此它适用于decimal 但不适用于double。有人可以解释一下吗?我不明白为什么会这样。
最佳答案
最有可能的情况是,如果您使用的是 DirectX(我能找到问题背后的唯一原因),这个问题似乎与每次创建和/或处理设备时都会强制 FPU 为单精度有关模式,从而失去准确性并导致 double、long、decimal 变量被截断。如果我尝试使用 IEEE-754 浮点转换器并输入您的数据,我会得到这个结果,这正是您的情况:您的数据在某些时候被读取为 double ,但随后被截断为单个.precision float ,如您所见:
这个问题可以通过在 FpuPreserve 标志下显式构建 Device 对象来解决。
我也遇到了这个问题,一开始虽然是关于不正确的转换,但经过长时间的跟踪后发现在我构建 DirectX 设备对象后值被截断了。
关于c# - c#中的双倍乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37441872/
我有三个 double 组列表。我想将数组1复制到数组2并将其放入第三个数组中。 // ArrayList 1 [0.0, 1.0, 0.0, 1.0] // ArrayList 2 // Rando
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在编写一个带有变量 long balance 的银行程序将美分存入账户。当用户输入金额时,我有一种方法可以将美元转换为美分: public static long convertFromUsd (
如何 DRY(不要重复自己)RSpec 中的 double?例如: let(:s1) {instance_double(Class1, :att
我是 Java 新手,我想知道为什么当你有双 10/4 时却得到 2? double 是否总是必须有小数才能得到正确的答案?谢谢。 public class Super { public st
我正在用 Python 为 Fortran 库编写前端。 Python 模块应该可以在 32 位和 64 位机器上运行;适用于 Windows、Linux 和 Mac。 我想了解一些数据类型的字节宽度
我有两个ajax json。一个用于聊天用户列表列,另一个用于每个用户的消息历史记录。当单击 $('.member_list ul li') 元素时...第二个 ajax 将 li 的值作为 json
从 GHCi 中的 .hs 文件加载 a = 2+2.0 并执行 :t a 显示 a::Double。 另一方面,在 GHCi 中执行 let b = 2+2.0 和 :t b 会显示 b::Frac
我是一名优秀的程序员,十分优秀!