如何以所有可用精度打印Rust浮点数?

Vic*_*ory 9 formatting rust cordic

我正在实现sin三角函数的CORDIC算法.为了做到这一点,我需要硬编码/计算一堆反正切值.现在我的功能似乎可以工作(由Wolfram Alpha验证)到打印的精度,但我希望能够打印我的所有32位精度f32.我该怎么办?

fn generate_table() {
    let pi: f32 = 3.1415926536897932384626;
    let k1: f32 = 0.6072529350088812561694; // 1/k
    let num_bits: uint = 32;
    let num_elms: uint = num_bits;
    let mul: uint = 1 << (num_bits - 2);

    println!("Cordic sin in rust");
    println!("num bits {}", num_bits);
    println!("pi is {}", pi);
    println!("k1 is {}", k1);

    let shift: f32 = 2.0;
    for ii in range(0, num_bits) {
        let ipow: f32 = 1.0 / shift.powi(ii as i32);
        let cur: f32 = ipow.atan();
        println!("table values {}", cur);
    }
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 10

使用精度格式说明符 ; a .后跟您要查看的精度小数点:

fn main() {
    let pi: f32 = 3.1415926536897932384626;
    let k1: f32 = 0.6072529350088812561694; // 1/k

    println!("pi is {:.32}", pi);
    println!("k1 is {:.32}", k1);
}
Run Code Online (Sandbox Code Playgroud)

我选择32,这是比小数点在任一这些的数量f32秒.

pi is 3.14159274101257324218750000000000
k1 is 0.60725295543670654296875000000000
Run Code Online (Sandbox Code Playgroud)

请注意,值不再匹配; 浮点值很难!正如评论中所提到的,您可能希望以十六进制打印,甚至将文字用作十六进制.


U00*_*07D 5

使用 precision 格式说明符是正确的答案,但要打印所有可用的 precision,只需避免指定要显示的位数:

// prints 1
println!("{:.}", 1_f64);

// prints 0.000000000000000000000000123
println!("{:.}", 0.000000000000000000000000123_f64); 
Run Code Online (Sandbox Code Playgroud)

这样,您将不会截断值,也不必修剪多余的零,并且所有值的显示都是正确的,无论它们是非常大还是非常小。

游乐场示例

为了完整性,精度格式说明符还支持指定固定精度(根据接受的答案):

// prints 1.0000
println!("{:.4}", 1_f64);
Run Code Online (Sandbox Code Playgroud)

以及在运行时指定的精度(const当然不需要):

// prints 1.00
const PRECISION: usize = 2;
println!("{:.*}", PRECISION, 1_f64); // precision specifier immediately precedes positional argument
Run Code Online (Sandbox Code Playgroud)