浮浮沉沉浮点数

啥是浮点数

浮点数就是小数,

30.1.0

1

0

2

30.1.0 * 10^2

30.1.0∗102与

3.01

1

0

3

3.01*10^3

3.01∗103是一样的,小数点可以跑来跑去,所以叫浮点数,字母缩写用f来表示,rust有分2和f64两种,区别是f32占32个二进制位,可以表达的精度到

1

0

7

10^{-7}

10−7,f64占64个二进制位,可以表达的精度到

1

0

16

10^{-16}

10−16。

蹦蹦跳跳别掉坑

但计算机中使用小数必须十分小心,比如说0.2这个小数,试试把它转成二进制,0.0011 0011 0011 0011…你会发现,这货变成了一个循环小数,对它进行存储就必须涉及对循环小数的舍入,而这又必然会导制了一定的偏差,比如,0.1/0.5结果会是0.20000000298023223876953125。这种情况叫浮点数陷阱,大多数情况,这种偏差是可以忽略的,因为就算出现偏差也到了小数点后六七位了,但对于一些相等判断,比如,0.1/0.5==0.2明明应该是对的,有时计算机会判断为错误,也因些,rust对浮点数并没有实现==运算,在需要判断相等的情况,可以使用(0.1/0.5-0.2).abs()<0.00001(具体几个0可以根据自己的需要的精度)来判断,差距很小的时候,何以认为就是相等了。

另外,对于一些没有定义的数据,如

1

\sqrt{-1}

−1

​(rust标准库中没有定义复数),如过大或过小的数(f32的范围约为正负

3.4

1

0

38

3.4*10^{38}

3.4∗1038)就会返回一个NaN即not a number,这是一个特殊值,对它的±*/结果都是NaN。

浮点数的本领

浮点数也自带了大量的方法,我们以f32为例写一些常用的例子。

正负无穷

在整数中,除数不可以为0,但在小数中,除数可以为0.0,比如,1.0/0.0,它是正无穷大。在浮点数中,它用+Inf_f32表示。同样负无穷大也可以用-Inf_f32表示。

fn main() {

println!("{}",1.0f32/0.0 + 10.0); /rust中,编译器可以自动推断数据的类型,0会被推断为u32,所以这里得用0.0以让rust推断为f32类型。

}

结果为Inf

一些常量

比如

π

\pi

π,

e

e

e等,在std::f32::consts中有定义,主要有:

E 欧拉数 (e) FRAC_1_PI 1/π FRAC_1_SQRT_2 1/sqrt(2) FRAC_2_PI 2/π FRAC_2_SQRT_PI 2/sqrt(π) FRAC_PI_2 π/2 FRAC_PI_3 π/3 FRAC_PI_4 π/4 FRAC_PI_6 π/6 FRAC_PI_8 π/8 LN_2 ln(2) LN_10 ln(10) LOG2_10 log2(10) LOG2_E log2(e) LOG10_2 log10(2) LOG10_E log10(e) PI 阿基米德的恒定 (π) SQRT_2 sqrt(2) TAU 整圈常量 (τ)

调用时,可以用std::f32::consts::E来直接使用。

计算绝对值:-3.5_f32.abs()计算反余弦:0.5_f32.acos()计算反双曲余弦:1.0_f32.acosh()计算反正弦:0.5_f32.asin()计算反双曲正弦:1.0_f32.asinh()计算反正切:1.0_f32.atan()计算反双曲正切函数:0.5_f32.atanh()计算数字的立方根:8.0_f32.cbrt(),返回2.0返回大于等于自身的最小整数:3.1_f32.ceil(),返回4。将值限定在一定的范围:a_f32.clamp(min,max),如果a

π

\pi

π,当然还有

e

e

e,具体请看标准库。双曲余弦函数:a_i32.sinh()计算指数:2.0_i32.exp(3)计算2的指数:exp2(3)计算小于或等于a的最大整数:a_i32.floor()返回a的小数部分:a_i32.fract()计算原点与(x,y)之间的距离:x_i32.hypot(y_i32)返回

x

2

+

y

2

\sqrt{x^2+y^2}

x2+y2

​判断是不是正常可运算的数据:a_i32.is_finite()。如果a既不是无穷大也不是NaN,则返回true判断是不是无穷大:a_i32.is_infinite(),如果是正无穷或者负无穷,返回true判断是不是NaN:`a_i32.is_nan(),如果是NaN,返回true。a_i32.is_normal(),数字不是零、无穷大、subnormal或NaN,返回true。a_i32.is_sign_negative(),如果数据带负号(包括-0.0和负无穷大),返回truea_i32.is_sign_positive(),如果数据带正号(包括+0.0和正无穷大),返回truea_i32.is_subnormal()`,如果是非规格化数(指特别小的小数,小到超过了i32可表示的范围),返回true计算数字的自然对数:a_i32.ln()计算以b为底的对数:a_i32.log(b)计算以10为底的对数:a_i32.log10()计算以2为底的对数:a_i32.log2()比较两个数的大小,返回大的那个:a_i32.max(b_i32)比较两个数的大小,返回小的那个:a_i32.min(b_i32)先乘后加:a_i32.mul_add(b,c)返回

a

b

+

c

a*b+c

a∗b+c计算幂:a_i32.powf(b) 返回

a

b

a^{b}

ab,这里b的类型是f32计算幂:a_i32.powi(b) 返回

a

b

a^{b}

ab,这里b的类型是i32计算倒数:`a_i32.recip(),如0.5_i32.recip()结果是2.0四舍五入:round(),如0.5_i32.round()结果为1.0a_i32.signum()返回一个表示a符号的数字,如果数字是正数,返回1.0,如果数字是负数,返回-1.0,如果数字是NaN,返回NaN。计算正弦:std::f32::consts::FRAC_PI_2.sin()返回

s

i

n

(

2

/

π

)

sin(2/\pi)

sin(2/π)同时计算正弦和余弦:std::f32::consts::FRAC_PI_4.sin_cos()返回一个元组(

s

i

n

(

4

/

π

)

,

c

o

s

(

4

/

π

)

sin(4/\pi),cos(4/\pi)

sin(4/π),cos(4/π))计算双曲正弦:a_i32.sinh()计算数字的平方根:a_sqrt() 如4.0_f32.sqrt()计算数字的正切:a_f32.tan()计算双曲正切:a_f32.tanh()将弧度转为度:a_f32.to_degree()将度数转换为弧度:a_f32.to_radians()a_f32.trunc():返回a的整数部分,对小数部分直接舍去,不做四舍五入。

推荐文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。