0
点赞
收藏
分享

微信扫一扫

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:;

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中.


举报

相关推荐

0 条评论