- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为基本类型编写类,因此代码在多个平台和编译器上在逻辑上是相同的(例如 int_least16_t
对应 int
)。为了娱乐! (我还是个学生。)我读到这个:
更糟糕的是:
Floating-point types MAY support special values:∞, NaN or -0
这意味着 float 可以是无符号的...
[编辑:是的,这是不同的东西,但没有:“,但必须支持负数”。哟,在标准中没有这样的东西它可能不支持正常的 0...(我没有规范。)see ]
我知道这就像 __int128 ,标准只是一个标准,但还是...IEEE-754 是 1985 年的,但有些机器可能很奇怪,并且一些遗留硬件没有 float 单元。
据我了解,float 是强制性的(不像 int16_t 那样是可选的),但可以在任何标准中,并且任何一组值都是可能的?
我们唯一拥有的是一些宏( <cfloat>
):
FLT_MIN
, FLT_MAX
- 即使FLT_MIN = IEEE-754::FLT_MIN
, float 可以是非 IEEE-754。例如 float with: flipped exponent with fraction...
FLT_RADIX
- 基地系统?如果是这样,可以帮助写出准确的值。但是,float 仍然可以是 3 位或 200 位(大小)...
FLT_EPSILON
-(从 1 到下一个)我们可能会使用它(带基数)来检查分数大小...
FLT_MANT_DIG
- 是“尾数”数字/分数大小吗?
FLT_MAX_EXP
- 在 IEEE-754 中用 1... 填充的指数,但外面可以是一个随机数?
如果 float 类似于 IEEE-754(符号、指数、分数),那么很容易,但如果 -0 和 NaN 是可选的,那么它可能是不同的。因为我不能区分它们,所以我不能使用位表示(以安全的方式)。如果 ∞ 是可选的,float
不再是安全类型。
我看到的唯一出路是向编译器添加宏。
我知道这是一个理论问题,但我感兴趣的是,当我们使用 float
时,是否有任何可能的检查或者我们都编写了依赖于实现的代码。关键字?
编辑 2022 年 5 月 4 日:
我想到了这个:
用户例如。代码:
//User eg. code:
int main()
{
float_M a = 1f;
float_M b = 0f;
std::cout << a/b; //should output infinty (IEEE-754)
}
//Code:
class float_M
{
public:
#ifdef __STDC_IEC_559__
float data;
//...
float_M operator/(float_M x){return float_M(data/x.data);}
//...
#else
/*union{
float data;
struct{//For noSign case ("absolutly catastrofic" case)
uint_least8_t sign : 1;
uint_least8_t exponent : 8;
uint_least32_t fraction : 23;
}
}*/ //no noSign case 🙂
float data;
//...
float_M operator/(float_M x){return divide(this, x);}
//funtion pointer alert!
static /*const (1*) */ float_M (*divide)(float_M a, float_M b) =
/*std::numeric_limits<float>::is_signed ?(*/
std::numeric_limits<float>::has_infinity ?(
std::numeric_limits<float>::has_quiet_NaN ?(
[]{return float_M(a.data/b.data);}
): &_divide_noNaN
): &_divide_noNaN
/*): &_divide_noSign*/
//...
#endif
}
它很丑陋(有函数指针),但可以防止在运行时发生错误的跳转。我希望 c++23 有更好的宏。
此外,更多链接:
最佳答案
在 C++ 中, std::numeric_limits<T>::is_iec559
的值应为 true
对于所有浮点类型 T
"if, and only if, the type adheres to ISO/IEC/IEEE 60559" ISO/IEC/IEEE 60559:2011 与 IEEE 754-2008 相同,因此:
#include <iostream>
#include <limits>
int main() {
std::cout << std::boolalpha << std::numeric_limits<float>::is_iec559 << '\n';
}
注意:如评论中所述,某些实现可能仍会报告 true
对于这个常量,即使它们的浮点类型没有完全遵循 IEEE 754-2008 标准。
例如,在gcc
,您可以使用选项 -Ofast
进行编译或 -ffast-math
这反过来又设置了许多选项,这些选项可能会导致依赖于 IEEE 或 ISO 数学函数规则/规范的精确实现的程序输出不正确。
在C99 (及更高版本),有条件特征宏,__STDC_IEC_559__
和 __STDC_IEC_559_COMPLEX__
,如果在您的实现中可用,它将告诉您它是否符合 IEC 60559:1989/IEEE 754−1985。
#include <stdio.h>
int main(void) {
#ifdef __STDC_IEC_559__
puts("true");
#endif
}
请注意,如果 __STDC_IEC_559__
未 定义,并不一定意味着该实现不使用 IEEE 754 float 。这可能只是意味着它没有这些条件特征宏。关于这些宏的一个有趣的注意事项是,如果您使用 -Ofast
或 -ffast-math
在gcc
,它们将不会被定义(与 C++ 测试不同)。
使用的 IEC/IEEE 标准的实际修订版在 C11 中发生了变化和 C17/18在C23 (草案)将有许多与浮点相关的新宏,它(当前)指的是 ISO/IEC 60559:2020 和 IEEE 754-2019,其中包含对 IEC 60559:2011/IEEE 754-2008 的小幅升级。
关于c++ - 如何检测非 IEEE-754 float ,以及如何使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72032458/
我知道问题的标题听起来很奇怪,但我不知道该怎么调用它。 首先,我有一个网格布局,我希望我的 .search-wrapper 宽度为 50% 并向右浮动。在我的演示中 jsfiddle整个 .searc
我们正在使用 QA-C 来实现 MISRA C++ 一致性,但是该工具会为这样的代码喷出错误: float a = foo(); float b = bar(); float c = a - b; 据
考虑 float a[] = { 0.1, 0.2, 0.3}; 我很困惑a稍后传递给函数 foo(float* A) .不应该是 float* 类型的变量指向单个浮点数,对吗?就像这里提到的tu
这可能是我一段时间以来收到的最好的错误消息,我很好奇出了什么问题。 原代码 float currElbowAngle = LeftArm ? Elbow.transform.localRotation
刚开始学习 F#,我正在尝试为 e 生成和评估泰勒级数的前 10 项。我最初编写了这段代码来计算它: let fact n = function | 0 -> 1 | _ -> [1
我已经使用 Erlang 读取二进制文件中的 4 个字节(小端)。 在尝试将二进制转换为浮点时,我一直遇到以下错误: ** exception error: bad argument in
假设我有: float a = 3 // (gdb) p/f a = 3 float b = 299792458 // (gdb) p/f b = 29979244
我每次都想在浏览器顶部修复这个框。但是右边有一些问题我不知道如何解决所以我寻求帮助。 #StickyBar #RightSideOfStickyBar { float : right ; }
我正在研究 C# 编译器并试图理解数学运算规则。 我发现在两种不同的原始类型之间使用 == 运算符时会出现难以理解的行为。 int a = 1; float b = 1.0f; Cons
假设我有: float a = 3 // (gdb) p/f a = 3 float b = 299792458 // (gdb) p/f b = 29979244
Denormals众所周知,与正常情况相比,表现严重不佳,大约是 100 倍。这经常导致 unexpected软件 problems . 我很好奇,从 CPU 架构的角度来看,为什么非规范化必须是 那
我有一个由两个 float 组成的区间,并且需要生成 20 个随机数,看起来介于两个 float 定义的区间之间。 比方说: float a = 12.49953f float b = 39.1123
我正在构建如下矩阵: QMatrix4x3 floatPos4x3 = QMatrix4x3( floatPos0.at(0), floatPos1.at(0), floatPos2.at(0),
给定归一化的浮点数f,在f之前/之后的下一个归一化浮点数是多少。 通过微动,提取尾数和指数,我得到了: next_normalized(double&){ if mantissa is n
关于 CSS“float”属性的某些东西一直让我感到困惑。为什么将“float”属性应用到您希望 float 的元素之前的元素? 为了帮助可视化我的问题,我创建了以下 jsFiddle http://
关于 CSS“float”属性的某些东西一直让我感到困惑。为什么将“float”属性应用到您希望 float 的元素之前的元素? 为了帮助可视化我的问题,我创建了以下 jsFiddle http://
我有一个新闻源/聊天框。每个条目包含两个跨度:#user 和#message。我希望#user 向左浮动,而#message 向左浮动。如果#message 导致行超过容器宽度,#message 应该
我想创建一个“记分卡”网格来输出一些数据。如果每个 div.item 中的数据都具有相同的高度,那么在每个 div.item 上留下一个简单的 float 会提供一个漂亮的均匀布局,它可以根据浏览器大
我正在学习使用 CSS float 属性。我想了解此属性的特定效果。 考虑以下简单的 HTML 元素: div1 div2 This is a paragraph 以及以下 CSS 规则: div {
我正在尝试从可以是 int 或 float 的文件中提取数据。我发现这个正则表达式将从文件 (\d+(\.\d+)?) 中提取这两种类型,但我遇到的问题是它将 float 拆分为两个。 >>> imp
我是一名优秀的程序员,十分优秀!