在C++中创建非规范化(亚正规)浮点值
Create denormalized (subnormal) floating point values in C++
出于测试目的,我需要在C++中创建一个正的和一个负的非规范化(也称为亚正规)float
和double
数。
我怎样才能写出这样一个数字?
您可以使用-std::numeric_limits<T>::denorm_min()
和std::numeric_limits<T>::denorm_min()
。产生的非规范化值有一个特殊的特性,这只是偶然的。如果你不想这样,可以乘以一些相当小的整数值。
为了获得充分的灵活性和覆盖率,请创建一个具有相同大小的无符号整数值和浮点值的并集。对于32位值,可能是无符号的int+float,对于64位值,则是无符号long+double。将所需的decorm值存储在integer字段中,并读取相应的浮点值。如果你想变得有趣,可以为浮点数的符号、指数和分数部分指定带位字段的整数。
对于正值,32位分母在[0x00000001
,0x007fffff
]的范围内,而对于负值,则在[0x80000001
,0x807fffff
]的范围内。
对于正值,64位去噪比在[0x0000000000000001
,0x000fffffffffffff
]的范围内,对于负去噪比,在[0x8000000000000001
,0x800fffffffffffff
]的范围中。
如果在平移并集中使用位字段,则符号位是任意的,指数是零,分数可以是除零之外的任何值。
另一种方法显然是,取最小归一化值DBL_MIN
(或者,好吧,std::numeric_limits<double>::min()
),并将其除以某物;类似于CCD_ 15。反转负次法线的符号。
以下是如何在内存中形成非规范化IEEE-754浮点值的演示。
const uint32_t denormal_as_int[2] = {0x0000001, 0x00000000};
double denormal;
memcpy(&denormal, &denormal_as_int, sizeof(denormal));
这样做的标准方法当然是@DietmarKüh 提到的方法
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- 终端不会为C++文件创建.exe文件吗
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息