2015-10-09 3 views
-1

При написании кода для моего класса мне удалось создать рабочий пример в Python, который соответствует всем требованиям, которые мой профессор намеревался достичь. Но когда я переводил его на C, чтобы передать его своему профессору, я нашел несколько проблем, которые, как я думал, мне удалось обойти, но оказалось, что я ошибался.Проблемы с sqrt() в 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, если корень является натуральным числом.

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

Но если бы я попытался крикнуть r_float_a в случае заявление он всегда будет возвращать ложные независимо от величины а:

#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

Используйте '% f' для печати поплавков и пар. –

ответ

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 выходит за рамки этого вопроса. Квадратный корень может быть отрицательным, но это не будет естественным числом. Квадратный корень из отрицательный номер входит в область комплекс номера.

+0

Я уверен, что будущие пользователи сочтут это полезным. – Leb

+0

Не могли бы вы объяснить неподписанные Я думаю, что знаю, почему, но было бы хорошо знать точно –

+0

@Leb и Chal Forget, я отредактировал ответ. –

0

ОП и Weather Vane методы не работают для больших float. float обычно имеет от 6 до 8 десятичных цифр точности. Для чисел, больших 1e14, sqrt(), сохраненный как float, всегда будет целым числом - конвертируется точно в целое число (если в целочисленном диапазоне).

Чтобы определить, есть ли float x является точным квадратом другого целого числа:

  1. тест, если x отрицательный, INF или NaN и не те патологические случаи.
  2. Используйте modff() для извлечения дробной части, а если нет 0.0, сбой.
  3. Используйте fmodf() для извлечения мантиссы/знака и экспонента. Изучите экспонента. Коэффициент превышения мощности выше float бит ширины - реформа x и затем применить @Weather Vane тест.

 Смежные вопросы

  • Нет связанных вопросов^_^