我知道C和C++标准留下了语言实现的许多方面 - 仅仅因为如果存在具有其他特征的体系结构,那么为它编写符合标准的编译器是非常困难或不可能的.
我知道40年前任何电脑都有自己独特的规格.但是,我不知道今天使用的任何架构:
CHAR_BIT != 8signed 不是两个补充(我听说Java有这个问题).我问的原因是我经常向人们解释C++不强制要求任何其他低级方面如固定大小的类型†.这很好,因为与其他语言不同,它使你的代码在正确使用时可以移植(编辑:因为它可以移植到更多架构而不需要模拟机器的低级方面,例如符号+幅度架构上的二进制补码算法) .但我感到很难过,我自己也无法指出任何特定的架构.
所以问题是:哪些架构具有上述属性?
† uint*_ts是可选的.
我们都知道0 0是不确定的.
但是,javascript说:
Math.pow(0, 0) === 1 // true
Run Code Online (Sandbox Code Playgroud)
和C++说同样的话:
pow(0, 0) == 1 // true
Run Code Online (Sandbox Code Playgroud)
为什么?
我知道:
>Math.pow(0.001, 0.001)
0.9931160484209338
Run Code Online (Sandbox Code Playgroud)
但为什么不Math.pow(0, 0)抛出错误呢?或者也许NaN会比...更好1.
我正在优化数值/统计库的排序函数,基于这样的假设:在过滤掉任何NaN并进行一些微调之后,可以将浮点数作为32位整数进行比较而不改变结果,并且可以将双精度数据进行比较64位整数.
这似乎加速了这些数组的排序大约40%,并且只要浮点数的位级表示是IEEE 754,我的假设就成立.是否存在人们实际使用的真实CPU(不包括在嵌入式设备中,这个库没有针对哪个)使用其他可能会破坏这种假设的表示?
float在使用IEEE754的系统中)double在使用IEEE754的系统中)您是否可以对数据类型的最小大小做出任何假设?
到目前为止我所读到的内容:
浮动???双???
值float.h和limits.h系统是否相关?
来自https://en.wikipedia.org/wiki/Long_double:
在 C++ 中,
long double指的是通常比双精度更精确的浮点数据类型。然而,与 C++ 的其他浮点类型一样,它不一定映射到 IEEE 格式。...
使用 GNU C 编译器,
long double无论该类型使用何种物理存储(可以是 96 位或 128 位),x86 处理器上的精度都是 80 位。在某些其他架构上,long double可以是double-double(例如在 PowerPC 上)或 128 位四倍精度(例如在 SPARC 上)。从 gcc 4.3 开始,x86 上也支持四倍精度,但作为非标准类型__float128而不是long double.Linux 上的 gcc 默认为 80 位扩展精度;在一些 BSD 操作系统(FreeBSD 和 OpenBSD)上,双精度模式是默认的,长双精度操作被有效地减少为双精度。
另一方面,面向 x86 的英特尔 C++ 编译器默认启用扩展精度模式。在 OS X 上,long double 是 80 位扩展精度。
看起来确实long double可能不是 IEEE 的 binary128 的实现,但为什么不这样做呢?为什么在某些情况下默认使用 80 位表示?
出于鲁棒性原因,我想检查浮点数是IEEE-754 + -Inf还是IEEE-754 Nan.我的代码如下,我想知道它是否正确:
#define PLUS_INFINITE (1.0f/0.0f)
#define MINUS_INFINITE (-1.0f/0.0f)
#define NAN (0.0f/0.0f)
float Local_Var;
/*F is a float numnber.*/
if((unsigned long)(F) == 0x7f800000ul)
{
Local_Var = PLUS_INFINITE;
}
elseif((unsigned long)(F) == 0xff800000ul)
{
Local_Var = MINUS_INFINITE;
}
/*fraction = anything except all 0 bits (since all 0 bits represents infinity).*/
elseif((((unsigned long)(F) & 0x007ffffful) != 0ul )
&&((unsigned long)(F) == 0x7f800000ul))
||
(((unsigned long)(F) & 0x807ffffful) != 0ul )
&&
((unsigned long)(F) == 0xff800000ul))
{
Local_Var = NAN;
} …Run Code Online (Sandbox Code Playgroud) 我正在研究OS便携式数据库系统.我希望我们的数据库文件是可移植的操作系统,以便客户可以自行决定将其数据库文件移动到其他类型的操作系统.由于这个用例,我需要我的数据类型在OS之间保持一致,我想知道IEEE浮点数和双数字是否保证在任何操作系统上都是相同的字节大小?
c ×3
c++ ×3
ieee-754 ×2
architecture ×1
c++11 ×1
double ×1
javascript ×1
long-double ×1
performance ×1
portability ×1
posix ×1
pow ×1
sorting ×1
types ×1