有符号零的最小值和最大值

2023-11-24

我担心以下情况

min(-0.0,0.0)
max(-0.0,0.0)
minmag(-x,x) 
maxmag(-x,x)

根据维基百科 IEEE 754-2008说的是关于最小值和最大值

定义了最小和最大操作,但为输入值相等但表示不同的情况留有一些余地。尤其:

min(+0,−0) 或 min(−0,+0) 必须生成值为零的值,但可能始终返回第一个参数。

我做了一些测试比较fmin, fmax, 最小值和最大值定义如下

#define max(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })
#define min(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a < _b ? _a : _b; })

and _mm_min_ps and _mm_max_ps哪个叫上交所minps and maxps操作说明。

这是结果(我用来测试的代码发布在下面)

fmin(-0.0,0.0)       = -0.0
fmax(-0.0,0.0)       =  0.0
min(-0.0,0.0)        =  0.0
max(-0.0,0.0)        =  0.0
_mm_min_ps(-0.0,0.0) =  0.0
_mm_max_ps(-0.0,0.0) = -0.0

正如您所看到的,每种情况都会返回不同的结果。所以我的主要问题是 C 和 C++ 标准库说什么? Does fmin(-0.0,0.0)必须等于-0.0 and fmax(-0.0,0.0)必须等于0.0或者不同的实现允许以不同的方式定义它?如果它是实现定义的,这是否意味着为了确保代码与 C 标准库的不同实现(例如来自不同编译器)兼容,必须进行检查以确定它们如何实现 min 和 max?

关于什么minmag(-x,x) and maxmag(-x,x)?这些均在 IEEE 754-2008 中定义。这些实现至少在 IEEE 754-2008 中定义吗?我从 Wikipdia 对 min 和 max 的评论推断,这些是实现定义的。但据我所知C标准库并没有定义这些函数。在OpenCL 这些函数定义为

maxmag 返回 x 如果 | x| > |y|,或 y 如果 |y| > |x|,否则为 fmax(x, y)。

minmag 返回 x 如果 |x|

x86 指令集没有 minmag 和 maxmag 指令,所以我不得不实施它们。但就我而言,我需要性能,并且在大小相等时为情况创建分支效率不高。

Itaninum 指令集有 minmag 和 maxmag 指令(famin and famax)并且在这种情况下据我所知(通过阅读)在这种情况下它返回第二个参数。那不是什么minps and maxps不过似乎正在做。奇怪的是_mm_min_ps(-0.0,0.0) = 0.0 and _mm_max_ps(-0.0,0.0) = -0.0。我希望他们要么在这两种情况下返回第一个参数,要么返回第二个参数。为什么是minps and maxps指令是这样定义的吗?

#include <stdio.h>
#include <x86intrin.h>
#include <math.h>

#define max(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })

#define min(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a < _b ? _a : _b; })
   
int main(void) {
    float a[4] = {-0.0, -1.0, -2.0, -3.0};   
    float b[4] = {0.0, 1.0, 2.0, 3.0};
    __m128 a4 = _mm_load_ps(a);
    __m128 b4 = _mm_load_ps(b);
    __m128 c4 = _mm_min_ps(a4,b4);
    __m128 d4 = _mm_max_ps(a4,b4);
    { float c[4]; _mm_store_ps(c,c4); printf("%f %f %f %f\n", c[0], c[1], c[2], c[3]); }
    { float c[4]; _mm_store_ps(c,d4); printf("%f %f %f %f\n", c[0], c[1], c[2], c[3]); }
    
    printf("%f %f %f %f\n", fmin(a[0],b[0]), fmin(a[1],b[1]), fmin(a[2],b[2]), fmin(a[3],b[3]));
    printf("%f %f %f %f\n", fmax(a[0],b[0]), fmax(a[1],b[1]), fmax(a[2],b[2]), fmax(a[3],b[3]));

    printf("%f %f %f %f\n", min(a[0],b[0]), min(a[1],b[1]), min(a[2],b[2]), min(a[3],b[3]));
    printf("%f %f %f %f\n", max(a[0],b[0]), max(a[1],b[1]), max(a[2],b[2]), max(a[3],b[3]));    
}
//_mm_min_ps: 0.000000, -1.000000, -2.000000, -3.000000
//_mm_max_ps: -0.000000, 1.000000, 2.000000, 3.000000
//fmin: -0.000000, -1.000000, -2.000000, -3.000000
//fmax: 0.000000, 1.000000, 2.000000, 3.000000
//min: 0.000000, -1.000000, -2.000000, -3.000000
//max: 0.000000, 1.000000, 2.000000, 3.000000

Edit:

关于C++我测试过std::min(-0.0,0.0) and std::max(-0.0,0.0)两者都返回-0.0。这表明std::min不等于fmin and std::max不等于fmax.


为什么不阅读standard你自己?维基百科文章为IEEE包含标准的链接。

注:C标准文件不是免费提供的。但是最终稿是(这就是我链接的内容,搜索以查找 pdf 版本)。然而,我还没有看到这里引用的最终文件,而且据我所知,那里大部分都纠正了一些拼写错误;没有改变。不过,IEEE 是免费提供的。

请注意,编译器不需要遵守标准(例如,某些嵌入式编译器/版本不实现符合 IEEE 的浮点值,但仍然符合 C - 只需阅读标准以了解详细信息)。所以请查看编译器文档来查看兼容性。例如,MS-VC 甚至不兼容 C99(并且永远不会兼容),而 gcc 和 clang/llvm (大部分)在当前版本中与 C11 兼容(gcc 至少从 4.9.2 开始,部分从 4.7 开始)。

一般来说,当使用MS-VC时,检查它是否确实does支持使用的所有标准功能。它实际上并不完全符合当前标准,也不完全符合C99。

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

有符号零的最小值和最大值 的相关文章

  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 重载<<的返回值

    include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 我应该在哪里放置 Junit @Category 的接口类?

    我想定义项目范围的接口 用于 Category注释 并配置 Maven 在构建整个项目时排除其注释测试 In the 应用项目中有一个测试我想分类 Category Integration class Test public void te
  • Django 无法切换语言环境

    我有文件 locale es LC MESSAGES django mo 和 po 运行 makemessages 和compilemessages 绝对所有消息都已翻译 在settings py中有 USE I18N True LANGU
  • Laravel 中的位置标头

    我正在为我的大学的身份验证系统 Ucam Webauth 使用图书馆 这意味着我必须使用其中一种方法重定向到身份验证服务器 不幸的是 我无法退货Redirect to 因为这个图书馆的架构 图书馆本身使用header Location 但这
  • “kafka.zookeeper.ZooKeeperClientTimeoutException:等待连接超时”仅在列出主题期间

    我发现了一些主题相似但上下文不同的问题 我可以连接以创建主题 但无法列出主题 因为我收到了下面提到的错误 据我所知 人们在我时面临基本连接问题 我只是为了列出主题列表 如果重要的话 这是我的docker compose yml versio
  • IntelliJ switch 语句使用字符串错误:use -source 7

    我正在尝试使用 IntelliJ 在 Mac OS X 上 编译我使用 Eclipse 编写的一些代码 我尝试运行以下代码 switch category case below 20 below20 break case 20 to 29
  • Linux 中的 ps 实用程序(procps),如何检查使用哪个 CPU

    这是关于procps包 实用程序ps对于Linux 它可以打印每个进程 线程 最后使用的CPU数量吗 更新 不是 CPU 时间 10 秒 而是 CPU 编号 CPU0 CPU5 CPU123 ps 1 手册页说您可以使用psr field
  • 使用 awk 从不同文件中减去列

    我有两个文件夹 A1 和 A2 这两个文件夹中的文件名称和文件数量相同 每个文件有 15 列 文件夹 A1 中每个文件的第 6 列需要从文件夹 A2 中每个文件的第 6 列作为基底 我想将每个文件的第 2 列和第 6 列 相减后 打印到具有
  • 获取哈希符号后的请求部分

    我的网站有 AJAX 支持的搜索 它使用深度链接 当用户点击链接时 http example com articles tags Mac 20OS review 标签 Mac OS 和 评论 应该已经在搜索表单中选择 并且与 Mac OS
  • iOS 7 ANCS:发现主要 ANCS 服务 UUID

    在 iOS7 下 主要的 ANCS 服务是否需要不断进行广告宣传 或者是否需要在模糊设置中启用 使用自定义 CBPeripheralManager 使用 Apple 指定的服务和特征 UUID 实现 以便潜在的通知消费者成功发现它并订阅 A
  • HTML + CSS:没有句点的有序列表?

    我认为这个问题的答案是否定的 但是有人知道一种 HTML CSS 方法来创建一个数字后面没有句点的有序列表吗 或者 指定分隔符 理想情况下 我不想为每个数字使用不同的类进行列表样式图像 但这就是我到目前为止所能想到的 这看起来非常不语义 I
  • 如何确定Python中嵌套数据结构的类型?

    我目前正在将一些 Python 翻译成 F 具体来说神经网络和深度学习 为了确保数据结构正确转换 需要 Python 中嵌套类型的详细信息 这type 函数适用于简单类型 但不适用于嵌套类型 例如在 Python 中 gt data 1 2
  • 创建缓冲区时“尚未创建缓冲区”

    我有 我认为是 一个简单的 JFrame BufferStrategy 它是这样创建的 Buffer container createBufferStrategy 2 strategy container getBufferStrategy
  • 代理对是如何计算的?

    如果 unicode 代码点使用 17 位或更多 则如何计算代理对 Unicode 代码点是范围从 0x000000 到 0x10FFFF 的标 量值 因此它们是 21 位整数 而不是 17 位 代理对是 UTF 16 形式的一种机制 这将
  • AngularJS 模型

    我正在尝试了解 AngularJS 我很喜欢它 但我似乎忽略了一个核心概念 模型在哪里 例如 如果我有一个显示多个交易列表的应用程序 一个列表向服务器查询匹配某些条件的一组分页事务 另一个列表使用不同的条件 但可能有一些事务匹配这两个条件并
  • 我可以在 Visual Studio 2008 中针对 .NET Framework 4 进行开发吗?

    我的 ASP NET 应用程序在 Web 服务器上的 IIS 中运行 并使用 Microsoft NET Framework 4 Beta 2 其应用程序池设置为 NET Framework 版本 NET Framework v4 0 21
  • AngularJS:指令无法访问隔离范围对象

    我试图在具有隔离范围的指令中添加一些默认值 基本上 当我的指令被绑定时 我需要使用作用域对象进行一些 DOM 操作 下面是我的代码 控制器 angular module ctrl controller TempCtrl function s
  • 为什么这个苹果触摸图标不起作用?

    我的网站中有以下代码 当我在 Firefox 中查看源代码并单击 href 属性时 图标会显示 因此它不是 404 错误 当代码添加到页面时 例如http website com mobile index php or http websi
  • INSTALL_FAILED_USER_RESTRICTED :使用 redmi 4 设备的 android studio

    遇到这个奇怪的错误 Installation failed with message Failed to finalize session INSTALL FAILED USER RESTRICTED Install canceled by
  • matplotlib 颜色条中的小刻度

    我目前正在尝试在颜色栏中设置小刻度 但根本无法使其工作 我尝试过 3 种方法 参见下面的代码 但它们似乎都不起作用 颜色条中是否真的可能有微小的刻度 import numpy as np import matplotlib pyplot a
  • 有符号零的最小值和最大值

    我担心以下情况 min 0 0 0 0 max 0 0 0 0 minmag x x maxmag x x 根据维基百科 IEEE 754 2008说的是关于最小值和最大值 定义了最小和最大操作 但为输入值相等但表示不同的情况留有一些余地