我在这里做双重浮动转换

时间:2015-04-11 15:48:13

标签: c++

const double dBLEPTable_8_BLKHAR[4096] = {
  0.00000000000000000000000000000000,
  -0.00000000239150987901837200000000,
  -0.00000000956897738824125100000000,
  -0.00000002153888378764179400000000,
  -0.00000003830892270073604800000000,
  -0.00000005988800189093979000000000,
  -0.00000008628624126316708500000000,
  -0.00000011751498329992671000000000,
  -0.00000015358678995269770000000000,
  -0.00000019451544774895524000000000,
  -0.00000024031597312124120000000000,
  -0.00000029100459975062165000000000
} 

如果我将上面的double改为float,那么当我对数组内容执行操作时,是否会产生转换cpu周期?或者在编译期间整理出“转换”?

说,dBLEPTable_8_BLKHAR[1] + dBLEPTable_8_BLKHAR[2],这样简单吗?

在相关的说明中,浮点数应该存储多少个尾随小数位?

这是c ++。

3 个答案:

答案 0 :(得分:2)

任何好的编译器都会在编译期间转换初始化器。但是,你也问了

  当我对数组内容执行操作时,是否会产生转换cpu周期?

这取决于执行操作的代码。如果表达式将数组元素与double类型的变量组合在一起,那么操作将以双精度执行,并且数组元素将在算术运算之前被提升(转换)。

如果只是将数组元素与float类型的变量(包括其他数组元素)组合在一起,那么操作将在浮点数上执行,语言不需要任何提升(但如果您的硬件只实现双精度操作,转换可能仍然可以完成。但是这样的硬件肯定会使转换变得非常便宜。)

答案 1 :(得分:1)

Ben Voigt回答了大多数部分的问题。 但你也问:

在相关的说明中,浮点数应该存储多少尾随小数位数

取决于您尝试存储的号码的值。对于大数字,没有小数 - 实际上格式甚至不能给出整数部分的精确值。例如:

float x = BIG_NUMBER;
float y = x + 1;
if (x == y)
{
    // The code get here if BIG_NUMBER is very high!
}
else
{
    // The code get here if BIG_NUMBER is no so high!
}

如果BIG_NUMBER是2 ^ 23,则下一个更大的数字将是(2 ^ 23 + 1)。

如果BIG_NUMBER是2 ^ 24,则下一个更大的数字将是(2 ^ 24 + 2)。

无法存储值(2 ^ 24 + 1)。

对于非常小的数字(即接近于零),您将有很多小数位。

浮点数应非常谨慎使用,因为它们非常不精确。

http://en.wikipedia.org/wiki/Single-precision_floating-point_format

对于较小的数字,您可以尝试以下程序。

更改exp变量以设置起点。程序将显示该范围的步长和前四个有效数字。

int main (int argc, char* argv[])
{
    int exp = -27; // <---  !!!!!!!!!!!
                   // Change this to set starting point for the range
                   // Starting point will be 2 ^ exp

    float f;
    unsigned int *d = (unsigned int *)&f; // Brute force to set f in binary format
    unsigned int e;


    cout.precision(100);

    // Calculate step size for this range
    e = ((127-23) + exp) << 23;
    *d = e;
    cout << "Step size  = " << fixed << f << endl;
    cout << "First 4 numbers in range:" << endl;

    // Calculate first four valid numbers in this range
    e = (127 + exp) << 23;

    *d = e | 0x00000000;
    cout << hex << "0x" << *d << " = " << fixed << f << endl;

    *d = e | 0x00000001;
    cout << hex << "0x" << *d << " = " << fixed << f << endl;

    *d = e | 0x00000002;
    cout << hex << "0x" << *d << " = " << fixed << f << endl;

    *d = e | 0x00000003;
    cout << hex << "0x" << *d << " = " << fixed << f << endl;

    return 0;
}

对于exp = -27,输出将为:

Step size  = 0.0000000000000008881784197001252323389053344726562500000000000000000000000000000000000000000000000000
First 4 numbers in range:
0x32000000 = 0.0000000074505805969238281250000000000000000000000000000000000000000000000000000000000000000000000000
0x32000001 = 0.0000000074505814851022478251252323389053344726562500000000000000000000000000000000000000000000000000
0x32000002 = 0.0000000074505823732806675252504646778106689453125000000000000000000000000000000000000000000000000000
0x32000003 = 0.0000000074505832614590872253756970167160034179687500000000000000000000000000000000000000000000000000

答案 2 :(得分:0)

const double dBLEPTable_8_BLKHAR[4096] = {

如果您将该行中的double更改为float,则会发生以下两种情况之一:

  1. 在编译时,编译器会将数字-0.00000000239150987901837200000000转换为最能代表它们的float,然后将这些数据直接存储到数组中。

  2. 在运行时,在程序初始化期间(在main()被调用之前!),编译器生成的运行时将使用类型为float的数据填充该数组。

  3. 无论哪种方式,一旦您到达main()并编写了您已编写的代码,所有这些数据都将存储为float个变量。