【问题标题】:Why do the square of input decreases by one when using pow function? [duplicate]为什么使用 pow 函数时输入的平方减一? [复制]
【发布时间】:2020-03-06 21:48:31
【问题描述】:

这是一个简单的 C 程序,它接受来自用户的数字并生成平方。

#include <stdio.h>
#include <math.h>
int main()
{
    int number;
    int result;
    printf("\nEnter the number\n");
    scanf("%d",&number);
    result=(pow(number,2));
    printf("\nThe result is %d\n",result);
    return 0;
}

问题是,每当我输入 5,25,26 等作为输入时,输出为 24,624,675,即它减 1,并且并非所有数字都会发生这种情况。我正在使用 CodeBlocks IDE。我想出了解决此问题的方法,但我想知道幕后发生了什么,这是导致此错误的原因。

【问题讨论】:

  • 因为pow是一个浮点函数,最好不要用于整数计算。
  • @EugeneSh。你能解释一下为什么不是每个数字都发生这种情况吗?
  • 如果要对整数类型求平方,只需将其乘以自身...result = number * number;
  • 添加printf("%.25f\n", pow(number,2)); 了解原因。
  • @EugeneSh.:请不要关闭这些关于pow 的问题,因为它们与that 重复。当pow(25, 2) 返回的结果不是 625 时,这不是浮点运算造成的。 pow 完全有可能返回正确的结果(因为它是可表示的)并且是可行的(因为有现有的实现应有的结果,具有高质量的准确性和性能)。实际原因是由于pow 的低质量实现,而不是由于无法进行浮点运算。

标签: c mingw tdm-mingw


【解决方案1】:

来自this post,Sourav 告诉我们:

pow() 接受双参数并返回一个双精度值。

如果您将返回值存储到 int 中并打印出来,您可能无法得到想要的结果。

关于为什么pow() 的返回值比您预期的少 1,请参阅this post。具体来说:

pow() 适用于双数。这些代表s * 2^e 形式的数字,其中s 是一个53 位整数。因此double可以存储2^53以下的所有整数,但只能存储2^53以上的一些整数。特别是,它只能表示偶数 &gt; 2^53,因为对于 e &gt; 0,该值始终是 2 的倍数。

【讨论】:

  • 如果您说它是重复的,则将其标记为重复,而不是引用其他答案。
  • 那不是正确的原件。在那个问题中,结果太大而无法表示,pow 必然返回一个近似值。在这个问题中,表示这些特定结果的范围内的数字(精确),pow 返回不正确结果的原因不是因为表示它们有任何问题,而是因为它是一个低质量的pow 实现返回错误的结果。
猜你喜欢
  • 1970-01-01
  • 2020-09-25
  • 2015-12-31
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 2012-02-08
相关资源
最近更新 更多