在C中使用sqrt()有问题

2024-04-25 12:48:02 发布

您现在位置:Python中文网/ 问答频道 /正文

在为我的类编写代码时,我设法用Python创建了一个工作示例,它遵循了我的教授为我们提出的所有要求。但当我把它翻译成C语言交给我的教授时,我发现了几个问题,我以为我设法绕开了,但结果我错了。在

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

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

当我用C语言翻译时,我发现我在编译代码时收到了错误消息,说我试图用整数和其他很多东西来对浮点进行模运算。在

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

^{pr2}$

但是如果我试图在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);
    }
}

我怎样才能修正这个问题来检查一个数的平方根是否是一个自然数?在


Tags: or代码消息示例ifinclude错误math
2条回答

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

要确定float x是否是另一个整数的正平方:

  1. 检查x是否为阴性,INF或NaN,病理病例不合格。在
  2. 使用modff()提取小数部分,如果不是0.0,则失败。在
  3. 使用fmodf()提取尾数/有效位和指数。检查指数。在float位宽度-改革x然后应用@Weather Vane测试的偶数幂。在

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

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数的使用超出了这个问题的范围。平方根可以是负数,但那不是自然数。负数的平方根进入复数域。在

相关问题 更多 >