C++ 我在这里做双浮转换吗

C++ 我在这里做双浮转换吗,c++,C++,如果我将上面的double更改为float,那么当我对数组内容执行操作时,是否会导致转换cpu周期?或者“转换”是在编译时整理出来的 比如说,dBLEPTable_8_BLKHAR[1]+dBLEPTable_8_BLKHAR[2],像这样简单的事情 另一个相关的注意事项是,一个浮点数应该能够存储多少个尾随小数位 这是C++。< /P> < P>任何好的编译器都会在编译时转换初始化器。但是你也问了 当我对数组内容执行操作时,是否会产生转换cpu周期 这取决于执行操作的代码。如果表达式将数组元素与

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

比如说,
dBLEPTable_8_BLKHAR[1]+dBLEPTable_8_BLKHAR[2]
,像这样简单的事情

另一个相关的注意事项是,一个浮点数应该能够存储多少个尾随小数位


这是C++。< /P> < P>任何好的编译器都会在编译时转换初始化器。但是你也问了

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

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


如果您只是将数组元素与
float
类型的变量(包括其他数组元素)组合在一起,那么该操作将在float上执行,并且该语言不需要任何升级(但是,如果您的硬件只实现双精度运算,则仍可以进行转换。不过,这样的硬件肯定会使转换非常便宜。)

任何好的编译器都会在编译时转换初始值设定项。但是,您也问到

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

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


如果您只是将数组元素与
float
类型的变量(包括其他数组元素)组合在一起,那么该操作将在float上执行,并且该语言不需要任何升级(但是,如果您的硬件只实现双精度运算,则仍可以进行转换。不过,这样的硬件肯定会使转换非常便宜。)

任何好的编译器都会在编译时转换初始值设定项。但是,您也问到

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

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


如果您只是将数组元素与
float
类型的变量(包括其他数组元素)组合在一起,那么该操作将在float上执行,并且该语言不需要任何升级(但是,如果您的硬件只实现双精度运算,则仍可以进行转换。不过,这样的硬件肯定会使转换非常便宜。)

任何好的编译器都会在编译时转换初始值设定项。但是,您也问到

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

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

如果您只是将数组元素与
float
类型的变量(包括其他数组元素)组合在一起,那么该操作将在float上执行,并且该语言不需要任何升级(但如果您的硬件仅实现双精度运算,则仍可以进行转换。不过,这种硬件肯定会使转换非常便宜。)

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

  • 在编译时,编译器将把数字
    -0.00000000 239150987901837200000000
    转换为最能代表它们的
    浮点值,然后将该数据直接存储到数组中

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

  • 无论采用哪种方式,一旦进入
    main()
    和您编写的代码,所有这些数据都将存储为
    float
    变量

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

  • 在编译时,编译器将把数字
    -0.00000000 239150987901837200000000
    转换为最能代表它们的
    浮点值,然后将该数据直接存储到数组中

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

  • 无论采用哪种方式,一旦进入
    main()
    和您编写的代码,所有这些数据都将存储为
    float
    变量

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

  • 在编译时,编译器将把数字
    -0.00000000 239150987901837200000000
    转换为最能代表它们的
    浮点值,然后将该数据直接存储到数组中

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

  • 无论采用哪种方式,一旦进入
    main()
    和您编写的代码,所有这些数据都将存储为
    float
    变量

    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
    } 
    
    const double dBLEPTable_8_BLKHAR[4096] = {
    
    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!
    }
    
    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;
    }
    
    Step size  = 0.0000000000000008881784197001252323389053344726562500000000000000000000000000000000000000000000000000
    First 4 numbers in range:
    0x32000000 = 0.0000000074505805969238281250000000000000000000000000000000000000000000000000000000000000000000000000
    0x32000001 = 0.0000000074505814851022478251252323389053344726562500000000000000000000000000000000000000000000000000
    0x32000002 = 0.0000000074505823732806675252504646778106689453125000000000000000000000000000000000000000000000000000
    0x32000003 = 0.0000000074505832614590872253756970167160034179687500000000000000000000000000000000000000000000000000