@yourtexthere

Какую роль играют float и double в скобках?

Это программа для вычисления машинного эпсиона, какую роль играют float и double в скобках и почему без них решение выводиться не то, что находится в библиотеке float.h
(Программа написана на С, но в тегах есть только С++)

#include<float.h>
    #include<stdio.h>

    float eps = 1.0;
    while ((float)(1 + eps/2.0) != 1.0){ // тут
        eps /= 2.0;
    }

    printf("%e\n", eps);
    printf("%e\n", FLT_EPSILON);

    double epsi = 1.0;
    while ((double)((1 + epsi/2.0) != 1.0)){ //и тут
        epsi /= 2.0;
    }

    printf("%e\n", epsi);
    printf("%e\n", DBL_EPSILON);
  • Вопрос задан
  • 257 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Такая запись имени типа в скобках в выражении - это явное приведение типа. Тут вы указываете компилятору, что выражение надо преобразовать вот к такому вот типу (флоат, в данном случае).

float нужен вам в начале, потому что вещественные константы имеют тип double. Поэтому у eps/2.0 и 1.0 в первом цикле имеют тип double, все вычесляется в double. Преобразовав одно из выражений в float вы получаете то, что вам надо. Без этого все вычисления идут в double и ответ находится не тот. На самом деле там float при сравнении все-равно расширяется до double но на результат сравнения это не влияет в данном случае.

Еще, вместо явного приведения типов, можно поставить f после вещественных констант, чтобы указать компилятору, что это float:
while (1 + eps/2.0f != 1.0f){

Тогда вычисления будут во float и ответ будет правильный.

Во втором цикле double вам не нужен. Ведь вычисления итак идут в этом типе. Да и написано у вас там с опечаткой, вы к типу double приводите все выражение со сравнением. т.е. вы булево значение преобразуете в дабл. Потом оно назад в булево преобразуется при проверке условия циклом. В итоге это бесполезное действие.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
Первый float - это приведение выражения за ним к типу float.
Вообще говоря, ненужное, поскольку сложение int и float и без этого приведения будет float.

Второй double - демонстрация того, что писавший вообще не понимает, что делает.
Ибо тут к вещественному типу приводится... булев результат сравнения.
Ответ написан
@yourtexthere Автор вопроса
Ключевое слово float и double используется для объявления переменных с плавающей точкой одинарной и двойной точности соответственно. В данной программе они используются для приведения результата выражения к типу переменной с плавающей точкой.

В условии цикла while используется сравнение двух чисел, одно из которых получено путем деления eps на 2 и прибавлением единицы, а второе - просто единица. Сравнение проводится с помощью оператора !=. Если сравнение истинно, то цикл продолжается, в противном случае - прерывается.

Сравнение на равенство двух переменных типа float или double может быть неточным из-за ограниченной точности хранения чисел с плавающей точкой в компьютере. Используя (float) и (double) перед выражением в скобках, мы приводим результат к типу переменной с плавающей точкой соответствующей точности.

Если убрать скобки с выражения, то произойдет следующее: сначала выполнится деление переменной eps на 2.0, затем результат будет прибавлен к единице. Затем это выражение сравнится с единицей, используя оператор !=. В результате получится сравнение чисел разных типов (типа float и int), что может привести к некорректному результату.

Чтобы получить точный результат, программа использует константы FLT_EPSILON и DBL_EPSILON из заголовочного файла , которые определяют машинный эпсилон для типов float и double соответственно. Сравнивая результаты, полученные в цикле с этими константами, мы можем определить, какой результат является более точным.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы