为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

wiz*_*z21 2 floating-point rust

这段代码:

        let a = 1.00000003E-27f32;
        let b = 3.19291373E+17f32;
        println!("{:e} < {:e}", a/b, std::f32::MIN_POSITIVE);
Run Code Online (Sandbox Code Playgroud)

产生这个结果:

3e-45 < 1.1754944e-38
Run Code Online (Sandbox Code Playgroud)

首先,我期望零,因为它MIN_POSITIVE是最小正常正数。然后我读到了有关次正规数的内容。那么 Rust 打印这个结果是否是因为它是一个次正规数?但是,为什么它不显示为次正规数呢?

Eri*_*hil 5

\n

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

\n
\n

因为MIN_POSITIVE名字不好。它不是最小正可表示数,而是最小正可表示正规数。有小于它的正可表示值,称为次正规数。

\n
\n

那么 Rust 打印这个结果是否是因为它是一个次正规数?

\n
\n

的计算结果a/b为 2.80259692864963414184745916657983226256052388375303154351413656777958216537172120297327637672424316\xe2\x80\xa210 \xe2 \x88\x9245。Rust 打印3e-45是因为这是格式化的结果 2.80259692864963414184745916657983226256052388375303154351413656777958216537172120297327637672424316\xe2\x80\xa21 0 \xe2\x88\:e x9245用于f32

\n
\n

但是,为什么它不显示为次正规数呢?

\n
\n

次正规数没有特殊格式。它们是数字并且格式类似于数字。(所使用的位数可能会受到次正规数的粗糙度的影响。也就是说,由于次正规数的相对间距较小,因此可能需要更少的位数来区分次正规数及其数字。)

\n