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 打印这个结果是否是因为它是一个次正规数?但是,为什么它不显示为次正规数呢?
\n\n为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?
\n
因为MIN_POSITIVE
名字不好。它不是最小正可表示数,而是最小正可表示正规数。有小于它的正可表示值,称为次正规数。
\n\n那么 Rust 打印这个结果是否是因为它是一个次正规数?
\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