2016-03-26 13 views
0

数値を数値に分割して、追加すると最初の数値を与えるプログラムを作成しました。たとえば、1234年は1000年、200、30に分割されなければならない、と4pow()関数を使用したときの不正確

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h> 

int main() 
{ 
int i, num1, num2; 
char tmp[6]; // the number will be stored here as string 
int num3 = 12345; //the number 

sprintf(tmp, "%d", num3); //convert to string 
for(i = 0; i < strlen(tmp); i++) //check every digit 
{ 
    num1 = pow(10, strlen(tmp) - 1 - i); //every number will be multiplied by 10 
          //to the power of number of digits - 1 - counter 
    num2 = tmp[i] - '0'; //convert character to int 
    printf("%d\n", num1*num2); //print the number 
} 

return 0; 
} 

は、これが出力されます。

9999 
2000 
297 
40 
5 

あなたはなぜ、これは、正しくない見ることができるように?

+1

あなたの投稿のバージョンは 'pow'は、浮動小数点表現の誤りが含まれているためであるhttp://ideone.com/K3pY8r – xvan

+2

として動作しているようです。 – BLUEPIXY

+0

複数のオンラインコンパイラで試してみましたが動作しますが、私のPCでは動作しません。そのエラーを避けるにはどうすればよいですか? – user3711671

答えて

-1

問題は、浮動小数点計算では小さな誤差が生じる可能性があることです。すなわち、pow関数の結果は、予想よりわずかに大きいか、またはわずかに小さいかもしれません。 intに変換すると、結果は切り捨てられます。たとえば、pow(10,4)9999.999999を返した場合、intに変換すると、期待したとおりではない9999が得られます。一方、pow(10,3)1000.000001を返す場合、intに変換すると、期待される結果が得られます。

ここで(pow関数の結果が正確ではありませんしているコンピュータ上の)問題を実証しなければならないいくつかのコードです:どちらか、あなたの問題を避けるpowの結果を四捨五入する必要があるために

int main(void) 
{ 
    for (int i = 0; i < 5; i++) 
    { 
     double num1 = pow(10,i); 
     int num2 = num1; 
     printf("%12f --> %5d\n", num1, num2); 
    } 
} 

、または浮動小数点演算を完全に避けてください。ここでは整数計算だけを使って問題を解決する方法を示すコードがあります。

int main(void) 
{ 
    char temp[] = "12345"; 
    int length = strlen(temp); 

    int multiplier = 1; 
    for (int i = 1; i < length; i++) 
     multiplier *= 10; 

    for (int i = 0; i < length; i++) { 
     printf("%d\n", (temp[i] - '0') * multiplier); 
     multiplier /= 10; 
    } 
} 
+0

Multi-dup。 ............ –

関連する問題