gpt4 book ai didi

c# - 为什么 (double)0.6f > (double)(6/10f)?

转载 作者:可可西里 更新时间:2023-11-01 09:10:37 27 4
gpt4 key购买 nike

这是我电脑上发生的事情:

(double)(float)0.6
= 0.60000002384185791

(double)0.6f
= 0.60000002384185791

(double)(6/10f)
= 0.6

(double)(float)(6/10f)
= 0.6

6/10f也是个 float ,怎么能精确到0.6呢?
在我看来 (double)(6/10f) 也应该是 0.60000002384185791。有人可以帮忙解释一下吗?谢谢!

最佳答案

首先,重要的是要记住 0.6 不能准确地表示为 float 但它可以准确地表示为 double(浮点运算的不准确性已被详细记录,如果不清楚为什么 0.6 不能准确表示为 float ,请尝试 this link)

您看到上述行为的原因取决于编译器 - 如果您查看反射器中编译的程序集,那么这里发生的事情会更清楚一些:

(UPDATE 我已经更改了代码,因此它不使用 Console.WriteLine,因为我意识到编译器正在为您选择重载,这困惑的情况)

// As written in source
var j = (double)(float)0.6;
var k = (double)0.6f;
var l = (double)(6/10f);
var m = (double)(float)(6/10f);

// Code as seen by Reflector
double j = 0.60000002384185791;
double k = 0.60000002384185791;
double l = 0.6;
double m = 0.6;

为什么编译器选择以这种特定方式编译我不明白(仅供引用,这都是在优化关闭的情况下)

一些有趣的其他案例:

// Code
var a = 0.6;
var b = (double)0.6;
var c = 0.6f;
var d = (float)0.6;

var e = 6 / 10;
var f = 6 / (10f);
var g = (float)(6 / 10);
var h = 6 / 10f;
var i = (double)6 / 10;
// Prints out 0.60000002384185791

double n = (float)0.6;
double o = f;

// As seen by Reflector
double a = 0.6;
double b = 0.6;
float c = 0.6f;
float d = 0.6f;

int e = 0;
float f = 0.6f;
float g = 0f;
float h = 0.6f;
double i = 0.6;

double n = 0.60000002384185791;
double o = f;

编译器似乎只在一些特殊情况下使用上述技巧,我完全无法理解为什么它只在转换为 double 时才这样做!

其余时间它似乎会做一些诡计来使浮点运算似乎在实际上通常不会工作的地方工作。

关于c# - 为什么 (double)0.6f > (double)(6/10f)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3748768/

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