【问题标题】:Runtime float calculation vs evaluated calculation运行时浮点计算与评估计算
【发布时间】:2020-12-29 19:00:44
【问题描述】:

我的问题不是关于浮点计算的细微之处,而是关于它的评估方式的差异。鉴于此:

float a = 1f / 12;
int b = (int)(1f / a);

在运行时,b 将为 12。但如果我在 QuickWatch 或 LINQPad 等工具中评估它的表达式,则为 11。事实上,我无法在运行时使用 floatdouble 重新创建 11 的结果,或decimal;截断或Math.Floor

表达式的动态求值和运行时求值的区别是什么?

编辑

由于我看到人们得到与我不同的结果,这就是我所看到的。

运行时的结果:

VS QuickWatch 评估结果:

LINQPad 中的结果:

我的 VS 和框架版本:

【问题讨论】:

  • QuickWatch 是 Visual Studio 的 QuickWatch?因为我的 VS2019 QuickWatch 正确计算 12,如果我粘贴 (int)(1f / a)
  • LINQPad 版本 6.11.11 (X64) 说结果是 12
  • @xanatos 这确实很有趣。我只是自己尝试了一下,并重复地得到了 11 个(在 Quickwatch 中有两个单独的条目)。您是如何参赛的?
  • 简短的回答是浮点结果在运行时和位数之间并不一致。

标签: c# visual-studio-2019


【解决方案1】:

我认为这是浮点计算的问题

32 位程序(任何 CPU -> 首选 32 位检查)

64位程序

Visual Studio 封装在 32 位中,所以我认为这是因为 QuickWatch 以 32 位运行。

这就像在 QuickWatch 中计算 (int)(1f/12)

所以我认为检查计算的内容会更好

【讨论】:

    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 2012-09-21
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多