在C中遇到sqrt()问题

时间:2015-10-09 19:40:49

标签: python c math sqrt

在为我的课程编写代码时,我设法在Python中创建了一个工作示例,该示例遵循我的教授为我们设定的所有要求。但是当我将它翻译成C并将其交给我的教授时,我发现了几个问题,我认为我设法环绕了,但事实证明我错了。

我发现的一个问题是在Python中我使用以下代码来确定平方根是否是自然数。

if (math.sqrt(a**2+b**2)%2)==1 or (math.sqrt(a**2+b**2)%2)==0:

当我在C中翻译时,我发现我在尝试编译代码时收到错误消息,说我试图用整数和其他很多东西模拟浮点数。

我在C中做了一些测试运行以了解root周围的环境,发现如果root是自然数,则指定为float或double的变量返回0。

#include<stdio.h>
#include<math.h>
int main()
{
    float r_float_a, r_float_b;
    int a=16,b=15,r_int_a,r_int_b;
    r_float_a=sqrt(a);
    r_float_b=sqrt(b);
    r_int_a=sqrt(a);
    r_int_b=sqrt(b);
    printf("%d\n",r_float_a);
    printf("%d\n",r_float_b);
    printf("%d\n",r_int_a);
    printf("%d\n",r_int_b);
}

但是如果我试图在if语句中调用r_float_a,那么无论a的值是什么,它总是会返回false:

#include<stdio.h>
#include<math.h>
int main()
{
    float r_float_a, r_float_b;
    int a=16,b=15,r_int_a,r_int_b;
    r_float_a=sqrt(a);
    r_float_b=sqrt(b);
    r_int_a=sqrt(a);
    r_int_b=sqrt(b);
    printf("%d\n",r_float_a);
    printf("%d\n",r_float_b);
    if (r_float_a==0)
    {
        printf("%d\n",r_int_a);
    }
    else
    {
        printf("%d\n",r_int_b);
    }
}

如何解决此问题,以便检查数字的平方根是否为自然数?

2 个答案:

答案 0 :(得分:2)

显然,如果数字的平方根是自然(整数)数,那么数字本身也是如此。

unsigned a = 15;
unsigned root = (unsigned)sqrt(a);
if (root * root == a)
    printf("%u has the natural square root %u\n", a, root);
else
    printf("%u does not have a natural square root\n", a);

我使用unsigned因为自然数是一个完整的非负数。因此,signed数字的使用超出了本问题的范围。平方根可以是负数,但这不是自然数。 否定数字的平方根进入复数数字领域。

答案 1 :(得分:0)

对于大型for,OP和Weather Vane方法失败。 float通常具有6到8个十进制数字的精度。对于大于float的数字,保存为1e14的{​​{1}}将始终为整数 - 完全可转换为整数(如果在整数范围内)。

确定sqrt()是否是另一整数的确切平方:

  1. 测试float是否为阴性,INF或NaN并且未通过这些病理情况。
  2. 使用float x提取小数部分,如果不是0.0,则失败。
  3. 使用x提取尾数/有效数和指数。检查指数。将偶数幂提高到modff()位宽以上 - 改革fmodf()然后应用@Weather Vane测试。