我想找到特定计算机上的尾数位数和单位四舍五入。我了解它们是什么,只是不知道如何找到它们 - 尽管我知道它们可能因计算机而异。

我需要这个数字来执行数值分析的某些方面,例如分析误差。

我目前的想法是,我可以编写一个小型 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top