如何将信号 NaN 转换为安静 NaN?

2023-12-01

我想在 C 中将信号 NaN 转换为安静 NaN。有人可以建议一种方法吗?

Thanks.


我想我会扩展我的评论并提供解决方案。

这里棘手的部分是能够读取/比较sNaN而不触发异常。毕竟,它被称为“信号”是有原因的。维基百科说,即使是比较操作sNaN会触发异常。

所以直接使用number != number or isnan(value)可能不起作用,因为它们调用比较并会触发硬件异常。 (我不完全确定如何isnan(value)虽然已实施。)

EDIT :更正一下,看起来像isnan()即使在信令上也永远不会触发异常NaN所以这使得这个答案的其余部分毫无意义。

谓词 isNaN(x) 确定一个值是否为 NaN,并且从不 即使 x 是一个信号 NaN,也会发出异常信号。

这意味着它可以按照 Chrisoph 在评论中的建议来完成:

if(isnan(value))
    value = NAN;

这是我原来的答案,不使用isnan(value):

所以我能想到的唯一方法就是采用按位路线。

假设float是标准 IEEE 单精度并且int是一个 32 位整数,那么这是一种解决方法:(请注意,我还没有测试过这一点。)

union{
    int i;
    float f;
} val;

val.f = //  Read the value here.

//  If NaN, force it to a quiet NaN.
if ((val.i & 0x7f800000) == 0x7f800000){
    val.i |= 0x00400000;
}

请注意,此方法并不完全符合 C 语言,并且将调用实现定义的行为。另请注意,由于需要在 FP 和整数单元之间移动数据,这种方法并不是特别有效。

这是它的工作原理:

  1. 联合显然是用来获取float进入一个int.
  2. All NaNs将有位0x7f80000放。 if 语句测试将检查是否所有这些位都已设置。
  3. i |= 0x00400000;迫使NaN到一个安静的NaN。位 22 决定是否NaN是沉默的或安静的。强制它为 1 会使其安静NaN.

EDIT 2:如果您不能使用联合,这里有一些其他方法(每种方法都有自己的缺点):

方法一:

float f = //  Read the value here.

int i = *(int*)&f;
if ((i & 0x7f800000) == 0x7f800000){
    i |= 0x00400000;
}

f = *(float*)&i;

缺点:它违反了严格的别名,但可能仍然有效。

方法二:

char buf[sizeof(float)];

float f = //  Read the value here.

*(float*)&buf = f;
int i = *(int*)&buf;

if ((i & 0x7f800000) == 0x7f800000){
    i |= 0x00400000;
}

*(int*)&buf = i;
f = *(float*)&buf;

同样的想法适用于memcpy().

缺点:如果对齐很重要,您需要确保buf已对齐。

方法三:实施你自己的isnan():

看这个问题:isnan 的源代码在哪里?

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

如何将信号 NaN 转换为安静 NaN? 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 为什么libc++的shared_ptr实现使用完整内存屏障而不是宽松内存屏障?

    在boost的实现中shared ptr 它用放松内存排序以增加其引用计数 https github com boostorg smart ptr blob master include boost smart ptr detail sp
  • 在搜索 List 时,为什么 Enumerable.Any(Func predicate) 比带有 if 语句的 foreach 慢

    最近有件事引起了我的好奇心 Why is the Enumerable Any Func
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 应用程序启动时的种子数据库 - ASP MVC 3 和 EF

    由于某种原因 我无法让我的应用程序在应用程序启动时使用一些测试数据为数据库播种 执行顺序 1 Application Start in Global asax Database SetInitializer
  • Windows 8 上的文件历史记录

    我有一个相关问题使用 C 获取 设置 文件历史记录 Windows 8 设置 Windows提供了API文件历史API that 允许应用程序读取和修改文件历史记录配置 该 API 有 C 版本吗 它需要 NET 4 5 吗 有没有关于如何
  • Android 13 上的 ndef.connect() 时出现 SecurityException

    我有这个代码 Java 来编写nfc标签 private Tag tag Override protected void onNewIntent Intent intent if NfcAdapter ACTION TAG DISCOVER
  • 使用 shell 脚本从 sqlite 导出到 csv

    我正在制作一个 shell 脚本来将 sqlite 查询导出到 csv 文件 就像这样 bin bash bin sqlite3 sys xserve sqlite db headers on bin sqlite3 sys xserve
  • 在另一个文件中查找一个文件中的行

    因此 我有一个包含名称列表的 file1 txt 和一个包含另一个名称列表的 file2 txt 我需要一个包含两个文件中的名称的列表 I tried grep f file1 txt file2 txt gt newlist txt但由于
  • 用 Javascript / jQuery 中的正则表达式替换模式的所有实例

    首先 我对正则表达式了解不多 需要买一本书 因为事实证明它很难掌握 最终我想采用一个dom元素 并替换直括号 和 内的文本 并在文本周围插入链接 并且字符串中可能有多个括号集 function changeTip var link a hr
  • 找不到“jquery-ui”Rails 3.2

    我一直在到处寻找以解决这个问题 我已经在 gemfile 中将 jquery rails gem 降级到 2 3 0 但是当我在 application js 中包含 jquery ui 时 我仍然收到 Sprokets FileNotFo
  • 简单的 Java Web 服务

    有谁知道将 Java 方法发布为 Web 服务的一种非常简单的方法吗 我真的不想要使用 Tomcat 或 Jetty 或任何其他容器框架的开销 场景 我在服务类型应用程序中有一组 Java 方法 我想从本地 LAN 上的其他计算机访问它们
  • 转储java对象的属性

    是否有一个库可以递归转储 打印对象属性 我正在寻找类似的东西控制台 dir Firebug 中的函数 我知道 commons lang反射到字符串生成器但它不会递归成一个对象 即 如果我运行以下命令 public class ToStrin
  • Android:来自错误线程的领域访问。 Realm 对象只能在创建它们的线程上访问

    所以里面一个IntentService 该应用程序可能处于活动状态或处于非活动状态 onHandleIntent被调用 我将其放置在代码下面 这是我将数据存储到领域的地方 Realm realm null try realm Realm g
  • Nginx:在 url 重写中转义 #

    我有一个 MVC JavaScript 应用程序需要支持 Facebook 共享 这意味着它需要支持独特的 OG 元 HTML 标签 我正在做一个 Nginx 重写 它将检测 Facebook 爬虫以使用该部分的正确 OG 标签来服务器应用
  • 使用 formGroupDirective 重置表单 - Angular 反应表单

    I am trying to find best way to reset angular reactive form I m bit confused for reset reactive forms and not able to fi
  • 你能让一个函数接受两种不同的数据类型吗?

    我有一个函数应该接受两种不同的数据类型作为输入 vec3 add vec3 vec this x vec x this y vec y this z vec z return this vec3 add num scalar this x
  • React - 在父级中拥有 api 函数总是一个好主意吗

    我有一个在 3 个不同地方使用的组件 该组件非常简单 它是一个带有按钮的输入文件组件 因此用户选择文件然后单击upload 我们称之为childComponent upload单击按钮时 应将图像上传到某些 API 服务axios 现在 正
  • 如何使用 open xml C# 禁用 Excel 中的网格线?

    我想在 Excel 中禁用 GridLines 并使用 C 中的 open xml 将自定义边框放入 Excel 单元格 我尝试过下面的代码 但是当我打开Excel时抛出异常 例外情况是 已修复部分 xl worksheets sheet
  • Msysgit bash 在 Windows 7 中慢得可怕

    我喜欢 git 并且经常在家中在 OS X 上使用它 在工作中 我们在Windows上使用svn 但希望在工具完全成熟后立即迁移到git 不仅仅是乌龟Git 而且还类似于由以下提供的非常好的 Visual Studio 集成视觉SVN 但我
  • 使用 C# 的年份差异[重复]

    这个问题在这里已经有答案了 如何计算两个日期之间的日期差 以年为单位 例如 Datetime Now Today 11 03 2007 多年 我编写了一个实现 可以正确处理相隔一年的日期 然而 与其他算法不同 它不能很好地处理负时间跨度 它
  • 如何使用类型标签/镜像在方法中获取构造函数参数?

    对于案例类别 case class MyClass param1 String param2 String 为什么采用这种反思方法 import scala reflect runtime universe import scala ref
  • 使用 PHP 查询 XML 文件

    使用PHP5有没有一种方法可以像查询数据库一样查询XML文件 如果我有一个包含 50 个酒店条目的 XML 文件 我如何查询该 XML 文件以获取特定条目 我还可以按字段 例如日期字段 重新组织 XML 条目吗 那么 如果我想按日期降序显示
  • 如何将信号 NaN 转换为安静 NaN?

    我想在 C 中将信号 NaN 转换为安静 NaN 有人可以建议一种方法吗 Thanks 我想我会扩展我的评论并提供解决方案 这里棘手的部分是能够读取 比较sNaN而不触发异常 毕竟 它被称为 信号 是有原因的 维基百科说 即使是比较操作sN