首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锈蚀: f32上基于奇怪状态的四舍五入行为

锈蚀: f32上基于奇怪状态的四舍五入行为
EN

Stack Overflow用户
提问于 2022-06-27 15:24:00
回答 1查看 54关注 0票数 3

当使用特定值计算两个nalgebra::Vector3结构的点乘积时,我得到以下行为(链接到操场):

代码语言:javascript
复制
use nalgebra::{Point3, Vector3}; // 0.31.0

fn dot(v1: Vector3<f32>, v2: Vector3<f32>) -> f32 {
    v1.x * v2.x + v1.y * v2.y + v1.z * v2.z
    
}

fn main() {
    println!("Run 1:");
    let u = Vector3::new(1000., -1000., 0.);
    let v = Vector3::new(-0.69294637441651, 0.720989108085632, 0.);
    println!(
        "self-written dot-product: \t{:.32}",
        dot(u, v)
    );
    println!(
        "nalgebra dot-product: \t\t{:.32}",
        u.dot(&v)
    );
    println!("\nRun2:");
    let u = Vector3::new(1000., -1000., 0.);
    let v = Vector3::new(-0.69294637441651, 0.720989108085632, 0.);
    println!(
        "nalgebra dot-product: \t\t{:.32}",
        u.dot(&v)
    );
}

输出:

代码语言:javascript
复制
Run 1:
self-written dot-product:   -1413.93554687500000000000000000000000
nalgebra dot-product:       -1413.93554687500000000000000000000000
Run2:
nalgebra dot-product:       -1413.93548250214189465623348951339722

我必须能够依靠计算永远是一样的。有什么想法吗?

与我之前的问题有关,由于不工作的示例前一个问题,我结束了该问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-27 19:57:03

正如@aedm在注释中提到的那样,您的dot()函数是造成这种行为的原因。作为一个初学者,我不太清楚这到底是什么原因,所以我在这里作了解释。

第一次定义变量时,

代码语言:javascript
复制
 9| println!("Run 1:");
10| let u = Vector3::new(1000., -1000., 0.);
11| let v = Vector3::new(-0.69294637441651, 0.720989108085632, 0.);

锈蚀编译器不知道值的确切类型,它只知道它是float。如果没有额外的信息,编译器就会选择f64作为默认浮动类型在锈蚀中

调用dot(u, v)时--让编译器知道确切的类型,因为您在函数声明中指定了它们:

代码语言:javascript
复制
 3| fn dot(v1: Vector3<f32>, v2: Vector3<f32>) -> f32 {

编译器现在可以确定uv的值是f32类型的。

然后使用.dot()方法,它可以同时处理f32f64uv的类型已经定义为f32,变量的类型不能更改,但是由于.dot()可以处理f32,所以编译器很高兴。在这一点上,你可以得到:

代码语言:javascript
复制
Run 1:
-1413.93554687500000000000000000000000
-1413.93554687500000000000000000000000

在此之后,您将使用相同的名称定义新变量--同样,编译器没有关于变量类型的显式信息。但是这一次没有dot(u, v)调用,只有.dot()和后者不需要f32,所以编译器使用默认的f64。最后你会得到:

代码语言:javascript
复制
Run2:
-1413.93548250214189465623348951339722
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72774605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档