gpt4 book ai didi

c - 使用 pow() 函数时不准确

转载 作者:行者123 更新时间:2023-11-30 18:12:23 25 4
gpt4 key购买 nike

我编写了一个程序,将一个数字拆分为多个数字,当相加时,给出第一个数字。例如,1234 应分为 1000、200、30 和 4。

#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

如您所见,这是不正确的,为什么?

最佳答案

问题是浮点计算可能会有小误差。也就是说,pow函数的结果可能会比预期稍大或稍小。当您转换为 int 时,结果将被截断。例如,如果 pow(10,4) 返回 9999.999999,则转换为 int 会产生 9999,其中不是你所期望的。另一方面,如果 pow(10,3) 返回 1000.000001,则转换为 int 将给出预期结果。

这里有一些代码可以演示该问题(在 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 );
}
}

为了避免这个问题,您要么需要对 pow 的结果进行四舍五入,要么完全避免 float 学。下面的一些代码展示了如何仅使用整数数学来解决问题。

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;
}
}

关于c - 使用 pow() 函数时不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36239190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com