Почему pow(x,y) возвращает inf, когда x и y являются символами?

Я понимаю, как правильно использовать pow(), мне просто интересно, почему при запуске этого кода ans = inf.

Мне трудно понять это.

Имеет ли это какое-либо отношение к тому, что символы могут принимать только значения от -128 до +127 и способ вычисления pow()?

Это как-то связано с пробелом в " %c", как в моем первом параметре scanf?

Linux 4.9.0-7-amd64 debian 4.9.110-1 версия gcc 6.3.020170516

#include <stdio.h>
#include <math.h>

int main ()
{

    char base, exp; 
    float ans; 

    printf("Enter base number : ");
    scanf(" %c", &base); 

    printf("Enter exp number : ");
    scanf(" %c", &exp); 

    ans = pow(base,exp); 

    printf("%c raised to the %c power equals %f", base, exp, ans);

    return 0; 
}

person Niko_Jako    schedule 10.08.2018    source источник


Ответы (2)


Когда вы вводите base и exp с помощью %c, вы получаете символы '0''9', а не целочисленные значения. Таким образом, если вы введете 0 и 0, значения, которые вы получите (при условии кодировки ASCII), на самом деле будут равны 48, поскольку это код ASCII для '0'. Результат 4848 примерно равен 5 x 1080.

Затем вы сохраняете полученное значение в файле float. Предполагая, что float является одинарной точностью IEEE754, он может содержать показатель степени, не превышающий +/- 38. Таким образом, вы пытаетесь преобразовать значение вне диапазона, которое вызывает неопределенное поведение, а это означает, что результат непредсказуем. Если вы измените тип ans на double, вы увидите фактический результат.

person dbush    schedule 10.08.2018

Base и exp не являются целыми значениями (0-9). Итак, вы хотите ввести "%d". Не "%c"

person ThaRanga DaRshana    schedule 10.08.2018