第十四 算数运算
算数运算符
use std::f64::consts::{PI, E,FRAC_PI_2, SQRT_2};
fn main() {
let x = 11;
let y = 2;
let z = -31;
let r : f64 = 2.0;
println!("{}", x + y);
println!("{}", x - y);
println!("{}", x * y);
println!("{}", x / y);
println!("{}", x % y);
println!("{}", z % x);
println!("{}", PI * r.powi(2));
println!("{}", f64::sin(FRAC_PI_2));
println!("{}", SQRT_2);
println!("{}", 4096_f64.log2());
println!("{}", 4096_f64.log10());
//高考真题: a = 0.1e^0.1 , b = 1/9 , c = -ln(0.9),求三者的大小关系
//正确答案:c < a < b
println!("{}", 0.1 * E.powf(0.1));
println!("{}", 1.0_f64 / 9.0_f64);
println!("{}", -(0.9_f64).ln());
}
模运算的性质
$$ (a + b)\mod n = ((a\mod n) + (b\mod n)) \mod n $$ $$ (a - b)\mod n = ((a\mod n) - (b\mod n)) \mod n $$ $$ (a * b)\mod n = ((a\mod n) * (b\mod n)) \mod n $$
fn main() {
let a: i64 = 12345;
let b: i64 = 6789;
let n: i64 = 97;
// Rust 的 % 是“余数”(可能为负),要得到真正的“模”需用 rem_euclid,
// 否则当中间结果为负时上述性质不严格成立。
assert_eq!((a + b).rem_euclid(n), (a.rem_euclid(n) + b.rem_euclid(n)).rem_euclid(n));
assert_eq!((a - b).rem_euclid(n), (a.rem_euclid(n) - b.rem_euclid(n)).rem_euclid(n));
assert_eq!((a * b).rem_euclid(n), (a.rem_euclid(n) * b.rem_euclid(n)).rem_euclid(n));
println!("(a+b) mod n = {}", (a + b).rem_euclid(n));
println!("(a-b) mod n = {}", (a - b).rem_euclid(n));
println!("(a*b) mod n = {}", (a * b).rem_euclid(n));
println!("模运算三条性质均已验证 ✅");
}
整数溢出处理
当运算结果超出类型范围时,Rust 提供了四种显式的溢出处理方式(Debug 模式下直接算术溢出会 panic):
fn main() {
let a: u8 = 250;
let b: u8 = 10;
// 1. checked_*:溢出返回 None
println!("checked_add: {:?}", a.checked_add(b)); // None
// 2. wrapping_*:溢出回绕(模 2^n)
println!("wrapping_add: {}", a.wrapping_add(b)); // 4 (260 - 256)
// 3. saturating_*:溢出饱和到边界值
println!("saturating_add: {}", a.saturating_add(b)); // 255
// 4. overflowing_*:返回(结果, 是否溢出)
println!("overflowing_add: {:?}", a.overflowing_add(b)); // (4, true)
}
三角函数,反三角函数
use std::f64::consts::PI;
fn main() {
// 弧度
let x: f64 = PI / 2.0;
println!("{}", f64::sin(PI));
println!("{}", x.sin());
println!("{}", x.cos());
println!("{}", x.tan());
println!("{}", (PI / 4.0).tan());
// 计算 30 度 (π/6 弧度) 的正弦值
let angle_deg = 30.0_f64;
// 转换为弧度
let angle_rad = angle_deg.to_radians();
let sin_val = angle_rad.sin();
println!("sin(30°) = {}", sin_val);
println!("sin(60°) = {}", 60.0_f64.to_radians().sin());
// 验证 tan(x) 是否等于 sin(x) / cos(x)
let x = 6.0_f64;
let tan_direct = x.tan();
let tan_computed = x.sin() / x.cos();
println!("tan(6°) = {}", tan_direct);
println!("sin(6°)/cos(6°) = {}", tan_computed);
//勾三股四弦五,求勾所对应的角度是多少?
//sin(x) = 3/5,求对应的角度x
let x = 0.6_f64;
let theta = x.asin();
let theta_deg = theta * 180.0 / PI;
println!("弧度 = {} ,角度 = {}", theta, theta_deg);
}
20以内所有阶乘
fn factorial_checked(n: u64) -> Option<u64> {
(2..=n).try_fold(1u64, |acc: u64, x: u64| {
let acc = acc.checked_mul(x)?;
Some(acc)
})
}
fn main() {
// 使用示例
for i in 2..=20 {
match factorial_checked(i) {
Some(result) => println!("{}! = {}", i, result),
None => println!("计算溢出"),
}
}
}
例子
高考真题: a = 0.1e^0.1 , b = 1/9 , c = -ln(0.9),求三者的大小关系
正确答案:c < a < b
求证:$$\boldsymbol{-\ln(1-x) < x e^x < \frac{x}{1-x},\quad x\to0^+,;0<x<1}$$
分两段证明:$$\boldsymbol{-\ln(1-x)<xe^x}$$、$$\boldsymbol{xe^x<\dfrac{x}{1-x}}$$。
一、先证右侧:$$\boldsymbol{xe^x < \dfrac{x}{1-x}\ (0<x<1)}$$
$x>0$,两边同除以$x$等价于: $$e^x < \frac1{1-x}\iff e^x(1-x)<1$$ 设 $$F(x)=e^x(1-x)-1,\quad F(0)=e^0\cdot1-1=0$$ 求导: $$F’(x)=e^x(1-x)-e^x=-x e^x<0,\quad x>0$$ $F(x)$在$x>0$严格递减$$\Rightarrow F(x)<F(0)=0$$,即 $$e^x(1-x)<1\Rightarrow e^x<\frac1{1-x}\Rightarrow xe^x<\frac{x}{1-x}.$$ ✅ 右半不等式成立。
二、再证左侧:$$\boldsymbol{-\ln(1-x)<xe^x\ (0<x<1)}$$
变形: $$xe^x+\ln(1-x)>0$$ 构造 $$G(x)=xe^x+\ln(1-x),\quad G(0)=0+\ln1=0$$ 求一阶导: $$G’(x)=e^x+xe^x-\frac1{1-x}=e^x(1+x)-\frac1{1-x} $$ $$ G’(0)=1\cdot1-1=0 $$
再求二阶导: $$ \begin{aligned} G’‘(x)&=e^x(1+x)+e^x-\frac1{(1-x)^2}\ &=e^x(x+2)-\frac1{(1-x)^2} \end{aligned} $$ $$G’’(0)=2-1=1>0$$。
由**泰勒展开($x\to0^+$)**辅助验证: $$ \begin{aligned} -\ln(1-x)&=x+\frac{x^2}{2}+\frac{x^3}{3}+\frac{x^4}{4}+\cdots\ \end{aligned} $$
$$ \begin{aligned} xe^x&=x\left(1+x+\frac{x^2}{2}+\frac{x^3}{6}+\cdots\right)=x+x^2+\frac{x^3}{2}+\frac{x^4}{6}+\cdots \end{aligned} $$
逐项比较: $$ \begin{cases} x=x\ , \dfrac12x^2<x^2\ , \dfrac13x^3<\dfrac12x^3\ , \cdots \end{cases} $$ 故小正数x:$$-\ln(1-x)<xe^x$$。
从导数单调性:$$G’(0)=0,G’‘(0)>0\Rightarrow x\to0^+$$ 时$G’(x)>0$,$$G(x)\nearrow \Rightarrow G(x)>G(0)=0$$, $$xe^x+\ln(1-x)>0\iff -\ln(1-x)<xe^x.$$ ✅ 左半不等式成立。
三、合并结论
$$\boldsymbol{-\ln(1-x) < x e^x < \frac{x}{1-x},\quad x\to0^+,;0<x<1}$$
补充:三者等价无穷小( $$x \to 0^+ $$)
$$-\ln(1-x)\sim x,\quad xe^x\sim x,\quad \frac{x}{1-x}\sim x$$ 三者是同阶等价无穷小,只是从低到高:$$-\ln(1-x)<xe^x<\tfrac{x}{1-x}$$。