大佬教程收集整理的这篇文章主要介绍了delphi – 我如何使信号NaN容易使用?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
QNaN通过在Math中声明的常量名为NaN的Delphi代码可用.该常数的定义是:
const NaN = 0.0 / 0.0;
我想要使用类似的东西来声明一个常数,这是一个信号NaN,但还没有找到一个方法来做到这一点.
你可以写这段代码:
function SNaN: Double; begin PInt64(@Result)^ := $7FF7FFFFFFFFFFFF;//this bit pattern specifies an SNaN end;
但是,浮点返回值的ABI意味着SNaN被加载到浮点寄存器,以便可以返回.自然会导致一个例外,而不是打败目的.
所以你被带领编写如下代码:
procedure SetToSNaN(out D: DoublE); begin PInt64(@D)^ := $7FF7FFFFFFFFFFFF; end;
现在,这样做很有用,但这是非常不方便的.假设您需要将SNaN传递给另一个功能.理想情况下,你想写:
Foo(SNaN)
而是你必须这样做:
var SNaN: Double; .... SetToSNaN(SNaN); Foo(SNaN);
所以,在积累之后,这里是一个问题.
有没有办法写入x:= SNaN并且有浮点变量x分配一个值是一个信号NaN?
@H_675_30@const iNaN : UInt64 = $7FF7FFFFFFFFFFFF; var SNaN : Double absolute iNaN;
编译器仍将SNaN视为常数.
尝试为SNaN分配一个值将给出编译时错误:E2064无法分配左侧.
procedure DoSomething( var d : DoublE); begin d := 2.0; end; SNaN := 2.0; // <-- E2064 Left side cAnnot be assigned to DoSomething( SNaN); // <--E2197 Constant object cAnnot be passed as var parameter WriteLn(Math.IsNaN(SNaN)); // <-- Writes "true"
如果您有编译器指令$WRITEABLECONSTS ON(或$J),则可以临时关闭该命令,以确保不会更改SNaN.
{$IFOPT J+} {$DEFINE UNDEFWRITEABLECONSTANTS} {$J-} {$ENDIF} const iNaN : UInt64 = $7FF7FFFFFFFFFFFF; var SNaN : Double ABSOLUTE iNaN; {$IFDEF UNDEFWRITEABLECONSTANTS} {$J+} {$ENDIF}@H_675_30@ @H_675_30@
以上是大佬教程为你收集整理的delphi – 我如何使信号NaN容易使用?全部内容,希望文章能够帮你解决delphi – 我如何使信号NaN容易使用?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。