Все, что я хочу, чтобы следующая программа делала, это печатала произведение всех положительных чисел меньше 30 (как в экспоненциальной, так и в неэкспоненциальной формах). Он отлично работает, когда переменная product
объявлена как float
или double
, но дает совершенно абсурдный (отрицательный) результат, когда тип long double
. Поэтому, пожалуйста, ответьте на эти два вопроса, вытекающие из него:
Почему
long double
дает совершенно абсурдные (даже отрицательные) результаты, в то время какfloat
иdouble
вводят переменнуюproduct
, выдавая правильные результаты?У меня такое представление, что
long double
есть не что иное, как версия с большой емкостьюdouble
, которая сама является версией с большой емкостью типаfloat
!!Теперь, что касается типов, которые дают правильный результат для
product
, то естьfloat
иdouble
, почему они дают одинаковый результат в экспоненциальной форме (%e
), но заметно различаются для неэкспоненциальной формы (%f
)?
#include<stdio.h>
int main(void)
{
int j;
float product=1; //Works fine
//double product=1; //Works fine
//long double product=1; //Produces absurd output.
for(j=2;j<=30;j=j+2)
product=product*j;
printf("The product of even numbers <30 is %e \n",product);
printf("The product in non-exponential form is %f",product);
}
Вывод для product
как число с плавающей запятой
The product of even numbers <30 is 4.284987e+16
The product in non-exponential form is 42849875099910144.000000
Вывод для product
как двойной
The product of even numbers <30 is 4.284987e+16
The product in non-exponential form is 42849873690624000.000000
Вывод для product
как long double
The product of even numbers <30 is -6.078565e-192
The product in non-exponential form is -0.000000