【问题标题】:Is -10 between 1.5 × 10^-45 and 3.4 × 10^38?-10 在 1.5 × 10^-45 和 3.4 × 10^38 之间吗?
【发布时间】:2019-03-05 10:22:58
【问题描述】:

-10 在 1.5e-45 和 3.4e+38 之间吗?

如果是,请向我解释原因。我数学没那么好。所以,对于这些问题级别的弱点,我们深表歉意。

根据C# documentation (of computer programming for that language) on Microsoft site,他们的变量float类型在1.5×1e-45和3.4×1e+38之间?

但是,1e-3 等于 0.0011e-6 等于 0.000001。这意味着我们减少负指数越多,结果值就越小,但仍然大于零。

问题来了,我尝试使用给它 -10 的浮点变量作为期望得到错误的值,但令我惊讶的是,-10 被接受了. 我很困惑。

【问题讨论】:

  • 文档缺少这方面的详细信息,但您可以有负数和正数。
  • 在那个页面的底部也有这样的评论。
  • @LasseVågsætherKarlsen 对decimal 的描述似乎更加荒谬:range is at least -7.9 × 10^-28 to 7.9 × 10^28-7.9 × 10^-28 是一个非常非常非常小的负数,接近于0。

标签: c# c#-4.0 floating-point c#-3.0


【解决方案1】:

文档没有明确说明,但是这两种浮点类型是有符号的。所以 -10 可以像 10 一样用浮点类型表示。

【讨论】:

【解决方案2】:

有几点需要注意。

第一个是float(就此而言,double)已签名,因此值可以是正数或负数(或零)。

另一个是范围是精度问题。如果您尝试将float 设置为小于其可以处理的绝对值的值,例如1E-50,它将被设置为零而不是错误;这就是当你将 1×10-50 舍入到它可以处理的精度时得到的,而如果你试图给它一个大于它可以处理的绝对值的值,比如1E50那么它将被设置为 ∞(或 -∞ 用于-1E50),因为这又是因为它可以代表那么大的东西。

【讨论】:

  • 类似地,如果你尝试((float)1234567890) == ((float)1234568000),你会得到true的结果,因为它会将它们四舍五入到相同的值,而如果你尝试((double)1234567890) == ((double)1234568000),你会得到一个结果false 因为double 可以处理更高的精度。
【解决方案3】:

那个 C# 文档写得不好,有一些错误或遗漏:

  • 它描述的范围仅适用于正有限数的幅度。浮点格式还包括零、负数和无穷大。因此,真实范围是从 -∞ 到 +∞。
  • 它使用近似十进制值来描述范围。 float 的真实值为:
    • 表示的最小正数正好是2 -149 SUP>,这是1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125e-45。 LI>
    • 最大可表示的有限数正好是 2128−2104,即 340282346638528859811704183484516925440。

【讨论】:

    猜你喜欢
    • 2021-09-26
    • 2012-12-04
    • 1970-01-01
    • 2011-05-29
    • 2019-03-05
    • 2023-03-04
    • 2014-05-13
    • 1970-01-01
    相关资源
    最近更新 更多