Как проверить, равен ли модуль числа 2 0 или нет

#c #if-statement

Вопрос:

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

 #include <iostream>
#include <math.h>

int checkforFloat(int x, int y)
{
    //will return 0 if no remainder remains, other value meaning has remainder
    return x%y;
}

int main()
{
    while(true)
    {
        std::cout << "Enter number to check if it has square root: ";
        double squareNumber{};
        std::cin >> squareNumber;

        double squareRoot{sqrt(squareNumber)};

        if(checkforFloat(squareNumber, squareRoot)==0)
        {
            std::cout<<"The number you entered has a square root number, and that is " << squareRoot << 'n';
        }
        else if(checkforFloat(squareNumber, squareRoot)!=0)
        {
            std::cout<<"Sorry, " << squareNumber << " has no square root.n";
        }
    }

    return 0;
}
 

и результат для этой программы выглядит так:

 Enter number to check if it has square root: 25
The number you entered has a square root number, and that is 5
Enter number to check if it has square root: 24
The number you entered has a square root number, and that is 4.89898
Enter number to check if it has square root: 225
The number you entered has a square root number, and that is 15
Enter number to check if it has square root: 226
Sorry, 226 has no square root.
 

Как вы можете видеть, эта строка работает неправильно (или я не могу понять, в чем проблема) else if(checkforFloat(squareNumber, squareRoot)!=0) , я не знаю, что происходит, но что происходит не так с этой программой, так это то, что она печатает число с квадратным корнем, даже если квадратный корень является числом с плавающей запятой. С другой стороны, если я использую int not double в качестве типа данных для переменной squareNumber , и squareRoot это не сработает для меня. Я не уверен, кроется ли проблема в else if заявлении или нет. Я новичок C , поэтому мне довольно трудно понять, что происходит не так.

Комментарии:

1. Прочитайте об IEEE 754 . Числа с плавающей запятой -странные звери. Скомпилируйте свой код с помощью GCC и всех предупреждений и отладочной информации: g -Wall -Wextra -g затем используйте отладчик GDB

2. Немного о стиле: if (x) ... else if (!x) ... можно написать проще как if (x) ... else ... . В этом втором звонке нет необходимости checkForFloat .

3. with no decimal point тьфу, я не думаю, что вам следует использовать double тогда, скорее придерживайтесь целых чисел. if a number have a square root with no decimal point Отлично — повторите от 1 до number / 2 ( 1?) и проверьте, есть ли i * i == number .

Ответ №1:

Вы не проверяете квадратный корень.
Вы проверяете, делится ли ввод на квадратный корень, округленный в меньшую сторону.
24 делится на 4, и, таким образом, проверка проходит.

Комментарии:

1. Да, вы правы. Я проверяю, делится ли ввод на квадратный корень, чтобы убедиться, что число не имеет десятичной точки. Например, если квадрат 25 равен 5, а затем я получаю модуль 25, деленный на 5, если он равен 0, это означает, что число не имеет десятичной точки, но модуль больше 0, что означает, что число имеет несколько десятичных точек.

2. Вы не выполняете 24% 4.8…., тип аргумента функции-int, поэтому значение с плавающей запятой теряет свою десятичную точку, а операция внутри функции составляет 24%4

3. Но это была распечатка 4.8… При использовании std::cout

4. Положите коут внутрь checkforFloat

Ответ №2:

Чтобы определить, не содержит ли значение с плавающей запятой десятичной дроби, просто округлите его и проверьте, не изменяет ли это значение:

 bool is_integral(float f) {
    return std::round(f) == f:
}