dnan的好处

即使在正确计算中,0.0也不是稀有的值.NaN总是错误的.0初化不会让它更好.
NaN传播.0.0不能.
检测所有代码来检测0.0是否有效?不,误报太多了,因为0.0是浮点常用值.
除非它是全局/静态变量,CC++初化它们为垃圾.是最糟糕的选择,因为它很难追踪.
其他语言,基本上不默认初化浮点数为NaN
很好的是,在D中导入C中定义结构和在D中导入的D中定义结构具有完全不同初值,尽管语法相同!

// foo_c.c
struct Foo {
    float x;
};

// foo_d.d
struct Foo {
    float x;
};

// main.d
import foo_d;
import foo_c;
import std.stdio: writeln;

void main(){
    foo_d.Foo f_d;
    foo_c.Foo f_c;
    writeln(f_d); // Foo(nan)
    writeln(f_c); // Foo(0)
}

来看看下面的C程序:

#include <stdio.h>

 struct Foo { float x; };

 int main()
 {
    struct Foo f;
    printf("%g\n", f.x);
 }

 //gcc test.c
 ./a.out
 2.12133e-15

C规则.这是因为D正在导入C代码,所以它更好地表现得像C代码.如果把浮点数和双精数放在静态数据中,C代码会初化它们为0.0.C这样做时,D再保持导入的C结构未初化是不合理的,因此初化它们为0.0合理的选择.

1%的时间,0是错误的值,你永远不会注意到,计算结果是关闭的.而对NaN,你会注意到,当打印结果中有"NaN"时,它无法隐藏.
从事科学,工程,会计,飞行控制等工作的人非常关心获得100%正确的结果.1%的错误是不可接受的.
D在使用NaN方面是独一无二的.
主要问题是要习惯它,如果使用默认为0的其他语言,则需要时间.
因此这是,D比其他语言更好的原因之一.
(许多语言设计师没有多少商业浮点工作经验,我是NCEG(数值C扩展组)的早期成员,它努力为C标准添加适当的浮点支持,包括严格支持NaN.我比其他人早几年在ZortechC/C++中实现了它.)
0nan更难溯源.但NaN默认初化更好.
它不应是"输出有点正确,所以假设它是正确的".它应该*是*正确,或*显然*错误.
人们应该明确地努力解决错误.
这些是我在波音公司从事飞行控制时学到的更多经验教训.
如,液压致动器(柱塞)来回驱动飞行控制面.致动器具有液压流体输入和输出端口.如果液压管路连接到错误的端口,则无法控制飞机,并坠毁.过去发生过很多次.波音的方法是:
1.端口大小不同
2.一个是左旋螺纹,另一个是右旋螺纹
3.线路和端口带颜色编码
4.管路布置,因此液压管路不够长,无法连接到错误端口
5.检查员必须在上面签字
6.作为飞行前检查表的一部分,正确操作测试飞行控制器
这就停止了问题.请注意,机械师必须付出多大努力才能弄错,如果他成功了,那对检查员来说*显然*是错误的.只要适合,设计时,我就把该理念融入至D中.

posted @   zjh6  阅读(46)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示