如何查找特定机器上的尾数长度?
-
20-08-2019 - |
题
我想找到特定计算机上的尾数位数和单位四舍五入。我了解它们是什么,只是不知道如何找到它们 - 尽管我知道它们可能因计算机而异。
我需要这个数字来执行数值分析的某些方面,例如分析误差。
我目前的想法是,我可以编写一个小型 C++ 程序来缓慢增加数字,直到发生溢出,但我不确定要使用什么类型的数字。
我走在正确的轨道上吗?究竟如何计算这一点呢?
解决方案
我认为,任何一种语言,你使用会指定花车的存储方式。我知道Java的使用特定的IEEE标准的做到这一点(754,我认为)。
如果没有指定,我想你可以只加0.5至1,看实际数量变化做自己的支票。如果是的话,再加入0.25至1,0.125至1,依此类推,直到数目不改变,是这样的:
float a = 1;
float b = 0.5;
int bits = 0;
while (a + b != a) {
bits = bits + 1;
b = b / 2;
}
如果你只有3个尾数位,然后1 + 1/16将等于1。
然后,你用尽你的尾数位。
您可能实际需要的碱基数为2而不是1中,由于使用IEEE754在开始一个隐含的“1+”。
编辑:
,因为它给出63个比特为清楚地具有4个字节的浮子系统似乎如上所述可以具有一些问题的方法。
这是否是做与中间结果(I怀疑它因为具有显式转换[while (((float)(a + b) != (float)(a))
]具有类似的问题相同的码)或(更可能的是,我相信)的单位值a
可以与更靠近位表示的可能性分数b
通过调整指数,我还不知道。
有关现在,最好依靠我上面提到的,例如如使用IEEE754的语言信息(如果该信息是可用的)。
我将在作为用于警惕玩家陷阱离开有问题的代码。也许有人有更多的浮点的知识,然后我可以留下一张纸条,解释为什么它的行为异常(无猜想,请: - )。
编辑2:
这一段代码通过确保中间体被存储在浮修复它。原来乔纳森莱弗勒是正确的 - 这是中间结果
#include <stdio.h>
#include <float.h>
int main(void) {
float a = 1;
float b = 0.5;
float c = a + b;
int bits = 1;
while (c != a) {
bits = bits + 1;
b = b / 2;
c = a + b;
}
printf("%d\n",FLT_MANT_DIG);
printf("%d\n",bits);
return 0;
}
此代码输出(24,24),以显示所计算的值相匹配的一个在头文件。
尽管用C,它应该是适用于任何语言(特别是一个其中的信息不是在头或凭借,它的语言文档中指定的可用)。我只在C测试,因为Eclipse需要很长时间,开始在我的Ubuntu箱: - )
其他提示
对于 C 以及扩展 C++,信息位于 <float.h>
或者 <cfloat>
标头。
对于 C99,信息位于标准的 5.2.4.2.2 节中:
FLT_RADIX
FLT_MANT_DIG
FLT_DIG
FLT_EPSILON
FLT_MIN_EXP
FLT_MIN
FLT_MIN_10_EXP
FLT_MAX_EXP
FLT_MAX
FLT_MAX_10_EXP
类似地,对于大多数这些的 DBL 和 LDBL 变体(没有 DBL_RADIX
或者 LDBL_RADIX
)。该标准建议了适合 IEEE 754 的值(1999 年推出的 IEEE 754 标准的旧版本;我相信 2008 年发布了一个新版本)。
您可能想在你的C退房<limits>
++库:
#include <iostream>
#include <limits>
#include <typeinfo>
template <typename T>
void printDetailsFor() {
std::cout
<< "Printing details for " << typeid(T).name() << ":\n"
<< "\tradix: " << std::numeric_limits<T>::radix << "\n"
<< "\tradix digits: " << std::numeric_limits<T>::digits << "\n"
<< "\tepsilon: " << std::numeric_limits<T>::epsilon() << "\n"
<< std::endl;
}
int main() {
printDetailsFor<int>();
printDetailsFor<float>();
printDetailsFor<double>();
printDetailsFor<long double>();
return 0;
}
我觉得你想std::numeric_limits<T>::digits
这应该是比尾数位的数目多一个。我的机打印出:
Printing details for i:
radix: 2
radix digits: 31
epsilon: 0
Printing details for f:
radix: 2
radix digits: 24
epsilon: 1.19209e-07
Printing details for d:
radix: 2
radix digits: 53
epsilon: 2.22045e-16
Printing details for e:
radix: 2
radix digits: 64
epsilon: 1.0842e-19