Разминка для мозгов: странная программа

Разминка для мозгов: странная программа

Имеется следующая программа:

#include <iostream>

#define DTYPE double

using namespace std;

int main() {

    DTYPE a = 1.0, b = 1.0;
    int p = 0;

    while (true) {
        a *= 10;
        if (a + b == a)
            break;
        p++;
    }
    cout << "(1) " << p << endl;


    DTYPE c0 = 0.0, c = 1.0;
    int e = 0;

    while (true) {
        c0 = c;
        c *= 10;
        if (c0 == c)
            break;
        e++;
    }
    cout << "(2) " << e - 1 << endl;

    return 0;
}

Для чего она предназначена? Как можно назвать результаты вычислений (1) и (2).

Предполагаю, что в (2) будет 308, поскольку, если бы в С++ существовали переменные, которые не имели бы ограничения( от -бесконечности до +бесконечности ) то, рак бы на горе свистнул быстрее, чем данный цикл закончился. Но в нашем любимом языке есть такая штука, как inf, тип double принимает это значение(это значение, или это просто так объект cout выводит?), когда кол-во нулей в числе больше 308(ну, по крайней мере, на моей машине это так, хотя тип double везде одинаков, ведь так?). А если число с 308ю нулями умножить ещё на 10( как это делается в цикле), то оно всё равно примет значение inf, поэтому, когда c достигает inf, на следующей итерации c0 тоже становится inf, а так как от умножения c на 10 значение не поменяется(оно же имеет значение inf), то цикл завершит свою работу.
Не знаю зачем это надо, я вижу только одно применение — цикл в 309 итераций :)

Я так понимаю, программа предназначена для определения значащих цифр и максимального значения порядка типа double.
Первое вычисление это минимальное количество значащих цифр, а второе — максимальное значение порядка.

Всё правильно ))

Это программа для исследования типов с плавающей точкой.

Если в #define DTYPE double вместо double подставить другой тип, например long double, то будет выведено количество значащих цифр и максимальное значение порядка для типа long double.

Эта программка мне понадобилась при исследовании типа long double в TDM-GCC, поскольку в документации ничего внятного я не нашёл ((

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.