dnan的好处
即使在正确
计算中,0.0
也不是稀有的值.NaN
总是错误的.0初化不会让它更好.
NaN
传播.0.0
不能.
检测所有代码来检测0.0
是否有效?不,误报
太多了,因为0.0
是浮点常用值.
除非它是全局/静态
变量,C
和C++
初化它们为垃圾.是最糟糕
的选择,因为它很难追踪
.
其他语言,基本上不默认
初化浮点数为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++
中实现了它.)
0
比nan
更难溯源.但NaN
默认初化更好.
它不应是"输出
有点正确
,所以假设
它是正确
的".它应该*是*
正确,或*显然*
错误.
人们应该明确
地努力解决
错误.
这些是我在波音
公司从事飞行控制
时学到的更多经验教训
.
如,液压致动器
(柱塞)来回驱动
飞行控制面.致动器
具有液压流体
输入和输出端口.如果液压
管路连接到错误的端口
,则无法控制
飞机,并坠毁.过去发生过很多次.波音的方法是:
1
.端口
大小不同
2
.一个是左旋
螺纹,另一个是右旋
螺纹
3
.线路和端口
带颜色编码
4
.管路布置,因此液压
管路不够长,无法连接
到错误端口
5
.检查员
必须在上面签字
6
.作为飞行前检查表的一部分,正确操作
测试飞行控制器
这就停止了问题.请注意,机械师
必须付出多大
努力才能弄错,如果他成功了,那对检查员
来说*显然*
是错误的.只要适合,设计
时,我就把该理念
融入至D中.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现