gpt4 book ai didi

c# - 简单 float 计算错误

转载 作者:太空狗 更新时间:2023-10-30 01:01:03 26 4
gpt4 key购买 nike

<分区>

我遇到了问题:

int q = 150;
float s = 0.7f;
float z = q*s;
int z1 = (int) (q*s);
int z2 = (int) z;

这导致

  • z1int,值为 104
  • z2int,值为 105

谁能解释一下?我不明白这些结果。


为避免关闭,我 (René Vogt) 添加了以下信息:

  • q*s 导致 float 的值为 105.0f(或者可能是 104.999999,但字符串表示最终为 105)。
  • 所以 z105
  • float

现在的问题是,为什么(int)z的结果是105,而(int)(q*s) 结果为 104?我可以在我的机器上重现它(i7、Win10、VS2015、.NET4.6.1)


和 IL 代码:

// Initialisation
// q = 150
ldc.i4 0x96
stloc.0
// s = 0.7f
ldc.r4 0.69999999
stloc.1

// calculating z
ldloc.0 // load q
conv.r4 // convert to float
ldloc.1 // load s
mul // q*s
stloc.2 // store float result to z

// calulating z1
ldloc.0 // load q
conv.r4 // convert to float
ldloc.1 // load s
mul // q*s
conv.i4 // convert to int
stloc.3 // store int result in z1 => 104!

// calculating z2
ldloc.2 // loading float z
conv.i4 // converting to int
stloc.s // write to z2 (last local variable -> "s" as stack address)
// => 105

所以我认为 z1z2 之间的唯一区别是对于 z2 中间 float 结果得到从寄存器写入局部变量的(z)存储位置。但这对结果有何影响?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com