在浮点值上否定运算符与提升::数学::更改符号
Negate operator vs boost::math::changesign on a floating point value
我发现了boost::math::changesign函数,但找不到使用它的理由。互联网保持无线电静音,甚至Boost本身也几乎不使用它。
我的想法是:
- 有些值禁止
-x
。 - 避免编译器错误。
- 运行时速度更快。
然而:
- 它似乎是对任何值的有效操作,至少对于 IEEE 754 而言。
- 我尝试过的不同编译器/平台为
changesign
和-x
https://godbolt.org/g/4ttsfW 生成位相同的结果。 - 当前的GCC和Clang为这两种方法生成相同的机器代码,较旧的机器代码(以及任何MSVC)为
changesign
https://godbolt.org/g/nT6j26 生成更长的组件。
boost::math::changesign
有效地在其操作数级别工作:它更改符号位,不受操作数其他方面的影响。这与一元-
运算符不同,因为一元-
运算符是数学运算符,并且可能受到 NaN 值的影响(例如,如果输入是 NaN,它可能会陷印)。-
运算符是否受此类影响取决于实现,而boost::math::changesign
旨在更改符号,而不管实现C++如何。
-
无关紧要,因为C++一元
-
运算符不受 IEEE 754-2008 中的negate
操作的约束。换句话说,C++说它有一个一元-
运算符并描述了它的一些行为,IEEE 754有一个反转符号位的negate
操作,但C++标准不要求一元-
运算符执行IEEE 754negate
操作。此外,问题中的链接指向一个问题,该问题的回答带有警告,确认C++的一元-
可能无法作为 IEEE 754negate
运行。 -
3. 显示 C++ 的可能实现集合(或 C++ 的一组可能的近似实现)中的一组点,并且不说明是否存在行为不同的C++的其他实现。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 在浮点值上否定运算符与提升::数学::更改符号
- 自动符号转换,用于对类等数学向量进行操作
- 不同的数学符号绑定与共享库与 dlopen 并直接链接到可执行文件 (Linux)
- 将数学符号存储到字符串 c++ 中
- 在 mfc 应用程序中显示数学符号
- 计算C (符号数学)中的Jacobian矩阵
- C :提取分析数学表达式的符号/变量
- 实现自定义非线性最小化,从符号数学到C
- 如何将字符符号作为动作数学的字符
- Visual Studio 2013有符号/无符号整数数学行为不同时,求值表达式作为函数参数,编译器切换
- 混合符号整数数学取决于变量大小
- 无符号数学需要更多的CPU指令吗?