如何使信号 NaN 易于使用?

2024-02-06

IEEE754 标准定义了两类 NaN:安静 NaN(QNaN)和信令 NaN(SNaN)。当 SNaN 加载到浮点寄存器时,浮点单元会引发异常。

QNaN 可通过名为的常量用于 Delphi 代码NaN声明于Math。该常数的定义是:

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 值?


这个声明在编译时解决了这个问题:

const
  iNaN : UInt64 = $7FF7FFFFFFFFFFFF;
var
  SNaN : Double absolute iNaN;

编译器仍然会处理SNaN作为常数。

尝试赋值给SNaN会给出编译时错误:E2064 Left side cannot be assigned to.

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 (or $J+),这可以暂时关闭以确保不改变SNaN.

{$IFOPT J+}
   {$DEFINE UNDEFWRITEABLECONSTANTS}
   {$J-}
{$ENDIF}

const
  iNaN : UInt64 = $7FF7FFFFFFFFFFFF;
var
  SNaN : Double ABSOLUTE iNaN;

{$IFDEF UNDEFWRITEABLECONSTANTS}
   {$J+}
{$ENDIF}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使信号 NaN 易于使用? 的相关文章

  • 如何比较枚举类型集

    从某个时刻开始 我厌倦了编写设定条件 and or 因为对于更多的条件或更长的变量名 重新编写会变得笨拙且烦人 所以我开始写助手这样我就可以写ASet ContainsOne ceValue1 ceValue2 代替 ceValue1 in
  • 阻止 IDE 自动添加使用单位

    我正在将 Lazarus 项目转移到德尔福西雅图 Lazarus 项目依赖于 40 多个单元 包括控件 并具有多种应用程序 在所有项目的使用条款中 他们使用了以下内容 uses Classes SysUtils Forms Controls
  • 为什么 Delphi 中的 ADO Next 记录处理速度变慢?

    我有一个多年前开发的 Delphi 4 程序 它使用Opus 直接访问 http sourceforge net projects directaccess 按顺序搜索 Microsoft Access 数据库并检索所需的记录 Delphi
  • Delphi 的内存分析工具?

    我建立了一个项目并运行它 然后在 Process Explorer 中查看它 结果发现它在启动时使用的 RAM 比我想象的要多 5 倍 现在 如果我的程序运行得太慢 我会将其连接到分析器并让它告诉我什么正在使用我的所有周期 有没有类似的工具
  • FireMonkey iOS RAD Studio XE2 - 在从 URL 加载的表单上显示图像

    是否可以将 TImage 放置在 iOS 的 FMX 表单上 并将图像 jpg 从 URL 加载到此 TImage 中以在 iOS 应用程序中显示 我尝试过但没有成功 任何正确方向的提示或指出都会受到赞赏 将 TButton TImageC
  • 如何在按键时识别 unicode 键?

    我的应用程序使用 unicode 字符 并且我有几个文本字段 我想限制用户输入特殊字符 例如 begin if not Key in a z A Z 0 9 13 8 then Key 0 if Key 13 then bOk Click
  • Delphi 7 - 处理表单中嵌入框架的 MouseWheel 事件?

    你好 我有一个表格 里面有几个框架 对于某些框架 我希望滚动内容 或至少处理鼠标滚轮事件 我已经尝试过以下方法 只需为每个帧分配一个 OnMouseWheel 事件处理程序 重写父窗体的 MouseWheel 事件 procedure TF
  • 使用 Delphi 读取 Excel 电子表格

    我需要使用 Delphi 2010 读取和写入 Excel 电子表格 没什么花哨的 只需读取和写入不同工作表上特定单元格和范围的值 需要在没有安装 Excel 的情况下工作并支持 Excel 2007 我看过的一些东西 我尝试过使用ADO
  • 对于大型简单数据库,SQLite 和 DISQLite 有何比较?

    两者有什么区别SQLite http www sqlite org and DISQLite http www yunqa de delphi doku php products sqlite3 index为什么我要选择其中一个而不是另一个
  • 在网格上拖动时拖动图像更改

    我正在 StartDrag 上创建自定义 DragObject 的实例 procedure TForm1 GridStartDrag Sender TObject var DragObject TDragObject begin DragO
  • Delphi 2005 Web 服务问题

    我在尝试通过 Delphi 访问 Web 服务时遇到问题 我使用了 2007 版 WSDLimp 工具的 java WSDL 看起来它已正确创建了所有对象 然而 当我制作一个调用该服务的测试程序时 每个对象都是空的 如果我在 HTTPRIO
  • Delphi 应用程序被 Google Chrome 视为“危险”

    我经常用Delphi 2009制作数学软件 并将其发布在我的网站上 然而 去年左右 Google Chrome 开始认为我的一小部分 但数量不断增加 EXE 是 有害的 并且 Google Chrome 拒绝下载它们 例如 今天我编写了一个
  • Firebird 或 NexusDB

    我知道有很多与 Delphi 数据库相关的问题 但我只考虑这两个数据库 我需要查询大约 100 000 条记录 根据您的经验 哪个更快 作为嵌入式 as C S Thanks 我还没用过 Nexus tbh 但我经常使用 Firebird
  • Delphi XE5 FireDAC 错误:无法加载供应商库 [libmysql.dll 或 libmysqld.dll]

    我在 Windows 7 64 位上使用 Delphi XE5 只是尝试 FireDAC 组件 我正在使用一个 TFDConnection 组件连接到本地 MySQL 数据库 v5 6 15 我已经将 libmysql dll 32位 v5
  • 在该对象调用的事件期间销毁该对象

    我有一个按钮 它的 OnClick 事件调用一个销毁按钮的过程 但随后 线程 想要返回到 OnClick 事件 并且我遇到了访问冲突 我完全被难住了 您需要在按钮的所有代码执行完毕后销毁该按钮 执行此操作的标准方法是将用户定义的消息发布到表
  • 构建机器是否需要单独的 Delphi XE4 许可证?

    用于通过以下方式构建应用程序dcc32在构建服务器上我可以使用 Delphi Trial 这种方法的许可证没有任何问题 现在 我将通过以下方式在 TeamCity 上构建 Delphi XE4 应用程序msbuild 我是否需要拥有构建机器
  • 如何为每个线程自动全局初始化/取消初始化某些内容?

    我有一个单位initialization and finalization部分 该单元包含一个复杂的对象 该对象在initialization并毁于finalization 但是 该对象还包含一个 ADO 连接 这使得跨线程使用它时出现问题
  • Delphi中AsInteger和Value有什么区别?

    我想知道以下两个与delphi中的数据集相关的语句之间的区别 dsMyDataSet ParamByName ID AsInteger 1122 If ID is integer dsMyDataSet ParamByName ID AsS
  • 如何在Delphi中实现人工神经网络? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想要一个人工神经网络 42 个输入神经元 168 个隐藏神经元 7个输出神经元 这个网络就是玩 连四子 的游戏 每场比赛结束时 网络
  • 当 datasnap 服务器中的用户授权失败时,是否可以更改响应代码?

    当用户授权失败时 是否可以更改 DataSnap Delphi XE3 服务器中的 HTTP 响应代码 目前正在回归HTTP 1 1 500 内部服务器错误 这可能发生在许多其他场景中 并且无助于描述问题 按照同样的想法 是否可以更改默认的

随机推荐

  • Git stash apply 没有返回工作目录?

    我提交了一些文件并将其推送到远程 然后发现自己有问题 想恢复推送进行一些编辑 我隐藏 恢复并想要重新应用隐藏 但应用后 我的工作目录仍然缺少文件 请帮忙 这是历史 git commit m Model package dev ec5e61d
  • 无法在 Eclipse 中的 JavaFX 项目中创建 FXML 文件

    操作系统 Ubuntu 14 04 IDE Eclipse Mars 1 版本 4 5 1 和场景构建器 2 I can t choose root element because as I understand it should be
  • 适用于 iOS 项目的 XCode 8 中的 CMake 和代码签名

    CMake 能够使用目标属性设置为 XCode set target properties app PROPERTIES XCODE ATTRIBUTE CODE SIGN IDENTITY PROPER IDENTIFIER XCode
  • 省略代码:条件属性和预处理指令之间有什么区别吗?

    我想知道两者之间有什么区别 define MYSYMBOL if MYSYMBOL public void foo endif and define MYSYMBOL Conditional MYSYMBOL public void foo
  • django安装问题[python]

    去年夏天我想学习 Web 开发 所以我安装了 Django 1 8 一个不稳定的版本 我是在没有pip的情况下安装的 我最近决定再试一次 但想使用稳定版本 1 7 1 并且为了简单起见想使用 pip 安装 我读到为了删除没有 pip 安装的
  • 计算机代数软件,用于最小化一组多项式中的运算次数

    我有多项式系统 相当简单的多项式表达式 但相当长 优化我的手牌 表达式按集合分组 在给定的集合中 多个变量中有共同的术语 我想知道是否有一个计算机代数系统 例如 Mathematica Matlab 或 sympy 可以优化多个具有常用项的
  • 如何在 centos 7 上链接 python3 以使用 openssl11/或最新版本的 openssl (1.1.1)

    我们想在centos 7中升级OpenSSL但没有成功 原因可能是这样的 通过 yum install openssl11 将 CentOS 7 升级到 OpenSSL 1 1 1 https stackoverflow com quest
  • Memcached 块限制

    为什么有硬编码的块限制 压缩后 0 5 兆 内存缓存 http memcached org 有人重新编译过它吗 我知道我不应该发送这样的大块 但这些额外的重块时不时地发生在我身上并造成严重破坏 这个问题曾经在官方常见问题解答 http co
  • AWS ALB 中基于路径的路由到具有多个端口的单个主机

    我想创建一个 ALB 它应该根据到不同网站的路径路由我的流量 例如 example com apple 应该转到 8080 example com grapes 应该转到 8180 example com oranges 应转到 8280
  • Rails 4 simple_form has_many 通过复选框不保存

    我正在尝试使用 simple form 通过复选框来实现员工经常性扣除表 我的代码有效 但所选的经常性扣除未保存在我的表中 我不明白为什么 这是我的模型 class Employee lt ActiveRecord Base belongs
  • 使用 maven-nar-plugin 在 Maven 中构建 C++ 项目

    有人使用 maven nar plugin 为不同平台 使用不同编译器构建 C 代码吗 如果有人请给我更多有关此的信息 我只是想知道如何使用 Maven 为不同平台构建 NAR 文件 我知道 为了能够在特定平台上构建项目 您应该在该平台上运
  • 在 Azure Functions 项目(.NET 标准 2.0)本地中找不到工作职能

    我正在尝试在 NET 标准 2 0 中创建一个 Azure Functions 项目 因为我需要在该项目中使用 NET 标准 2 0 类库 但是 当我尝试创建一个简单的 Azure Functions 项目并在本地运行它时 出现以下错误 h
  • em 中的媒体查询不受基本字体大小的影响

    我试图理解为什么设置不同的基本字体大小不会影响媒体查询的 EM 值 它们的默认基本字体大小为 16px 而其余内容反应正常 自己尝试一下 PX 中的媒体查询 https jsfiddle net sebtp n8x0tuvq 5 https
  • 输出导致与正则表达式不匹配的第一个字符

    是否可以输出导致与正则表达式不匹配的字符串 其索引 中的第一个字符 是否可以仅使用正则表达式匹配操作 或者必须使用更复杂的操作 例如 在 JavaScript 中 我可能有一个正则表达式 d 3 s d 2 匹配包含 3 位数字后跟空格和另
  • Android 中使用 xml 自定义形状

    我正在尝试绘制一个自定义形状 可以将其用作布局的背景 但我不能这样做 是否可以使用 android xml 中的 xml 绘制如下形状 我不知道如何从矩形的垂直中心切割半圆形 Use layer list制作这个自定义形状drawable
  • 无序对集合,编译错误

    我正在尝试创建一组无序的对 到目前为止我有 typedef std pair
  • 如何为子域配置 Facebook 应用程序

    我正在构建一个多租户应用程序 并且我挣扎将 Facebook 登录合并到 Web 应用程序中 例如 租户正在使用子域 http tenant 1 domain com http tenant 2 domain com http tenant
  • 如何识别STATUS_INVALID_CRUNTIME_PARAMETER异常

    平台是Windows 7 SP1 我最近花了一些时间调试由于代码将无效参数传递给 安全 CRT 函数之一而引起的问题 结果 我的应用程序立即中止 没有任何警告或任何内容 甚至没有崩溃对话框 起初 我尝试通过将 Windbg 附加到我的应用程
  • Chrome 浏览器 61v。单击可见区域之外的元素时出现问题

    当我将 Chrome 浏览器更新到 61v 时 单击可见区域之外的不可见元素会出现问题 早些时候它起作用了 尝试点击可见区域之外的链接 element Click 有 InvalidOperationException 元素在点 1134
  • 如何使信号 NaN 易于使用?

    IEEE754 标准定义了两类 NaN 安静 NaN QNaN 和信令 NaN SNaN 当 SNaN 加载到浮点寄存器时 浮点单元会引发异常 QNaN 可通过名为的常量用于 Delphi 代码NaN声明于Math 该常数的定义是 cons