![]() |
1
13
这是浮动精度问题。 第二条语句工作是因为编译器在发出.exe之前对表达式1e-3*1e3进行计数。 在ildasm/reflector中查找,它将发出类似
|
![]() |
2
4
这里的问题很微妙。C编译器不会(总是)发出以双重方式进行计算的代码,即使这是您指定的类型。特别是,它发出代码,使用x87指令以“扩展”精度进行计算,而不将中间结果四舍五入为两倍。 根据将1e-3计算为双精度或长精度,以及将乘法计算为双精度或长精度,可以得到以下三个结果中的任意一个:
很明显,第一个比较,一个不符合你期望的比较,正在按照我列出的第三个场景中描述的方式进行评估。1e-3被四舍五入为双精度,可能是因为您正在存储它并再次加载它,这会强制舍入,也可能是因为C将1e-3识别为双精度文本并以这种方式处理它。正在用长双精度计算乘法,因为
第二个比较中的乘法要么使用其他两个方法中的一个进行计算(您可以通过尝试“1>1e-3*1e3”来确定哪个方法),要么编译器在编译时计算表达式时,先对乘法结果取整,然后再将其与1.0进行比较。 如果不通过某些构建设置告诉编译器不要使用扩展精度,则很可能告诉编译器不要使用扩展精度;启用codegen到sse2也可能有效。 |
![]() |
3
2
看答案 here |
![]() |
4
2
嗯…奇怪。我无法再现你的问题。我也在使用C 3.5和Visual Studio 2008。我已经输入了你的例子
确切地
因为它是张贴的,我也没有看到
另外,第二个if语句正由编译器进行优化。当我检查ildasm/reflector中的调试和发布构建时,我看不到任何证据。这是因为我收到一个编译器警告说在它上面检测到了无法访问的代码。 最后,我不明白这怎么可能是一个浮点精度问题。为什么C编译器静态地计算两个双精度值与运行时的clr不同?如果真的是这样的话,那么就可以证明C编译器有一个bug。 编辑: 在多想了一会儿之后,我更确信这是 不 浮点精度问题。您一定是在编译器或调试器中偶然发现了一个bug,或者您发布的代码并不完全代表正在运行的实际代码。我对编译器中的错误持高度怀疑态度,但调试器中的错误似乎更可能出现。尝试重新构建项目并再次运行它。可能是与exe一起编译的调试信息不同步。 |
![]() |
Muhammad Umer · 为什么这个随机数猜谜游戏模拟产生5.8 4 月前 |
![]() |
Alisa Petrova · 在有向图中更改一对顶点以创建循环 5 月前 |
|
D W · Python-将浮点数从2转换为10到100位小数 6 月前 |
![]() |
Bartol · 确定python龟图形中的角度 10 月前 |
|
randomAlgo · 将弹簧设置为相同长度的成本最低 10 月前 |
![]() |
Fyodor · 在C中使用sin和cos计算数学表达式不正确? 10 月前 |
![]() |
Sergio · python中大量数字的乘法 10 月前 |