0

Visual C++ は初めてで、次の C++ コードを書きました。私は浮動小数点の乗算を行っているだけでした:)。しかし、私には問題があります。

#include "stdafx.h"
#define PI 3.14F
#define totalRound 10.00F

void MultiplyPIArrayStored()
{
    printf("\n\nAnalysis\n");

    float* defArr = new float[(int)totalRound];
    float inc=0.00F;
    for(float i=1.00F;i<=totalRound;i++)
    {
        defArr[(int)i]=i*PI;
        //printf("Calculation: #define => %f * %f = %f\n",i,PI,i*PI);
    }

    float lPI=3.14F;
    for(float i=1.00F;i<=totalRound;i++)
    {
        //printf("Calculation: local variable => %f * %f = %f\n",i,lPI,i*lPI);
        printf("#define =>%f; local variable=>%f\n",defArr[(int)i],i*lPI);
        if(defArr[(int)i]==i*lPI)
            inc++;
    }

    printf("\nequal rate %f percentage",(inc/totalRound)*100);
    printf("\ndifference rate %f percentage",((totalRound-inc)/totalRound)*100);
}

void MultiplyPI()
{
    printf("\n\nAnalysis\n\n");

    float lPI=3.14F;
    float inc=0.00F;

    for(float i=1.00F;i<=totalRound;i++)
    {
        printf("\nCalculation: #define => %f * %f = %f\n",i,PI,i*PI);
        printf("Calculation: local variable => %f * %f = %f\n",i,lPI,i*lPI);
        printf("#define => %f ; local variable => %f\n",i*PI,i*lPI);
        if(i*PI==i*lPI)
            inc++;
    }

    printf("\nEqual rate %f percentage",(inc/totalRound)*100);
    printf("\nDifference rate %f percentage",((totalRound-inc)/totalRound)*100);
}

int _tmain(int argc, _TCHAR* argv[])
{
    MultiplyPI();
    getchar();

    MultiplyPIArrayStored();
    getchar();

    return 0;
}

次の出力が得られます。

Analysis


Calculation: #define => 1.000000 * 3.140000 = 3.140000
Calculation: local variable => 1.000000 * 3.140000 = 3.140000
#define => 3.140000 ; local variable => 3.140000

Calculation: #define => 2.000000 * 3.140000 = 6.280000
Calculation: local variable => 2.000000 * 3.140000 = 6.280000
#define => 6.280000 ; local variable => 6.280000

Calculation: #define => 3.000000 * 3.140000 = 9.420000
Calculation: local variable => 3.000000 * 3.140000 = 9.420000
#define => 9.420000 ; local variable => 9.420000

Calculation: #define => 4.000000 * 3.140000 = 12.560000
Calculation: local variable => 4.000000 * 3.140000 = 12.560000
#define => 12.560000 ; local variable => 12.560000

Calculation: #define => 5.000000 * 3.140000 = 15.700001
Calculation: local variable => 5.000000 * 3.140000 = 15.700001
#define => 15.700001 ; local variable => 15.700001

Calculation: #define => 6.000000 * 3.140000 = 18.840001
Calculation: local variable => 6.000000 * 3.140000 = 18.840001
#define => 18.840001 ; local variable => 18.840001

Calculation: #define => 7.000000 * 3.140000 = 21.980001
Calculation: local variable => 7.000000 * 3.140000 = 21.980001
#define => 21.980001 ; local variable => 21.980001

Calculation: #define => 8.000000 * 3.140000 = 25.120001
Calculation: local variable => 8.000000 * 3.140000 = 25.120001
#define => 25.120001 ; local variable => 25.120001

Calculation: #define => 9.000000 * 3.140000 = 28.260001
Calculation: local variable => 9.000000 * 3.140000 = 28.260001
#define => 28.260001 ; local variable => 28.260001

Calculation: #define => 10.000000 * 3.140000 = 31.400001
Calculation: local variable => 10.000000 * 3.140000 = 31.400001
#define => 31.400001 ; local variable => 31.400001

Equal rate 100.000000 percentage
Difference rate 0.000000 percentage


Analysis
#define =>3.140000; local variable=>3.140000
#define =>6.280000; local variable=>6.280000
#define =>9.420000; local variable=>9.420000
#define =>12.560000; local variable=>12.560000
#define =>15.700001; local variable=>15.700001
#define =>18.840000; local variable=>18.840001
#define =>21.980001; local variable=>21.980001
#define =>25.120001; local variable=>25.120001
#define =>28.260000; local variable=>28.260001
#define =>31.400002; local variable=>31.400001

equal rate 40.000000 percentage
difference rate 60.000000 percentage

質問:関数 ' ' で float 配列を使用していますMultiplyPIArrayStored();。出力を見ると、配列に格納されている値が変更されています (出力の最後の部分を確認してください)。配列宣言に問題はありませんか?配列の値が変化するのはなぜですか?

4

1 に答える 1

1

それが浮動小数点演算の性質であるため、配列が変化しています。正確な値が必要な場合は、浮動小数点演算を使用しないでください。浮動小数点数をロードおよび格納すると、精度が拡張または縮小される場合があります。これにより、末尾の数字が変わる可能性があります。

2 人に 10 進数で「1/3」と書いてもらうと、違うことを書くかもしれません。誰かに「1/3」を 6 桁で 2 倍して書いてもらい、別の人に 2/3 を 6 桁で書いてもらうと、「.333333」が 2 倍になって「.666666」になるかもしれませんが、その人は 2 を書いています。 /3 は ".6666667" と書くかもしれません。2/3 から 1/3 を 2 回引くと、.000001 が残るかもしれません。これが近似表現の性質です。これが必要な動作でない場合は使用しないでください/必要。

于 2012-07-21T07:20:19.437 に答える