dnan的好处2
恕我直言,这是更好的方法,甚至不是异常
,而是错误
.
只要你有NaN
值,程序就是无用和损坏
的.
只要变量
变为NaN
,就应该抛它,而不仅是在操作时.
如下成立时它应该抛:
1,初化值为NaN
并在操作中使用
2,在初化外,置值为NaN
3,从函数返回NaN
这解决所有问题,因为:
你永远不会在整个
程序中传播NaN
值,从而更易
追踪它.
NaN
严格告诉你,在使用某些值
前,是错误的
无法有效
地解决它,即你必须
实际修复所有NaN
.
D允许使用std.math.hardware.FloatingPointControl
接口启用浮点异常
.
当然,这些是硬件
异常,因此你获得SIGFPE
而不是带回溯的抛错误
.要转换为D错误,需要安装信号
处理器,就像etc.linux.memoryerror
那样(或Windows
上的等价物)
可惜,似乎在实践中不管用,因为仅在创建NaN
时,而不是在传播
时触发"无效"
浮点异常.由于是在编译时
而不是运行时创建默认初化float/double
变量的初始NaN
值,因此不会触发异常
.
示例:
import std.math.hardware;
float div(float x, float y)
{
return x / y;
}
void main()
{
FloatingPointControl fpctrl;
fpctrl.enableExceptions(FloatingPointControl.severeExceptions);
float f = float.nan; // ok -无异常
float g = div(0.0f, 0.0f); // SIGFPE崩溃.
}
NaN
总是错误的.0.0
无处不在.如果从不查看输出
,则都不会注意
到其中错误
.
你需要分析数据流.我没有把DFA
放在前端,因为这会使它变慢
而无好处.
不必害怕在输出
中获得NaN
.相反应该很高兴
,因为你*知道*
有错误
.
D是帮助程序员创建正确,健壮和无错误
程序的工具.
检查整
你正在推广使用结构初值
作为特征
,而不是基本类型的初值
.
不同
在它必须为有意
设置的字段
值,并且仅针对该字段值
.它不是默认值
.
double compute_pop ()
{
double pop;
// 忽略实现,偶遇nan
pop = sqrt (-1.);
pop += 0.;
return pop;
}
int main ()
{
auto pop = compute_pop ();
if (pop < .5)
writeln ("不下雨");
else
writeln ("会下雨");
return 0;
}
前几天我玩isNaN
.用它来检查访问函数
中的初化
,来缓存昂贵计算
.在注意到发布版本
出现故障
前,这非常有效.过了一段时间,我才发现ldc
为发布版本,提供了fastmath
选项,它假定没有NaN
,而这导致isNaN
错误工作.
示例:
import std;
void main()
{
assert(isNaN(double.nan));
}
用--ffast-math -O
选项结合ldc
编译.
isnan
实现:
bool isNaN(X)(X x) @nogc @trusted pure nothrow
if (isFloatingPoint!(X))
{
version (all)
{
return x != x;
}
else
{
/*
历史背景保存的代码.至少在英特尔,简单的测试`x!=x`使用一条在一条指令中运行循环的`(ucomiss/ucomisd)`专用指令.`80`位和`128`位的代码更大,但仍小于下面基于整数的方法
*/
// 略...
}
}
这不仅与Walter
的理解相悖,而且与IEEE754
标准相悖.这是一篇更详细
文章:小心快速数学
具有快速数学的LLVM
假定所有浮点
操作数都是有限
的,即可在编译时
优化x!=x
为false
.足够聪明
的优化器
,如果识别出NaN
的位模式,原则上可优化检查位模式
.
UDA
等的好处
之一是,可用它们来选择LLVM
可执行的特定优化
,而无需选择明显危险
的优化.
1,2,3
不要滥用异常
0<=NaN
.确实,有时0是相等的.但它*不可能*
更好.
顺便,十六进制
数据没有NaN
值.但经常初化它为:0xDEADBEEF
这在野外
不太可能.因此,当转储十六进制
数据且有DEADBEEF
时,表明有未初化
数据.
我既用它在返回给调用者前,初化malloc
的数据,并为其设置释放
后数据.它在清理未初化
的分配数据
和释放后使用
错误方面非常有效
.使用0x00
远没有它有效.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现