Я нашел Stevens Computing Services – K & R Exercise 2-1 очень тщательный ответ K & R 2-1. Этот фрагмент полного кода вычисляет максимальное значение типа float
на языке программирования C.Вычисление точности с плавающей запятой (K & R 2-1)
К несчастью мое теоретическое понимание значений float
весьма ограничено. Я знаю, что они состоят из мантиссы (мантисса ..) и величина, которая является степенью 2.
#include <stdio.h>
#include <limits.h>
#include <float.h>
main()
{
float flt_a, flt_b, flt_c, flt_r;
/* FLOAT */
printf("\nFLOAT MAX\n");
printf("<limits.h> %E ", FLT_MAX);
flt_a = 2.0;
flt_b = 1.0;
while (flt_a != flt_b) {
flt_m = flt_b; /* MAX POWER OF 2 IN MANTISSA */
flt_a = flt_b = flt_b * 2.0;
flt_a = flt_a + 1.0;
}
flt_m = flt_m + (flt_m - 1); /* MAX VALUE OF MANTISSA */
flt_a = flt_b = flt_c = flt_m;
while (flt_b == flt_c) {
flt_c = flt_a;
flt_a = flt_a * 2.0;
flt_b = flt_a/2.0;
}
printf("COMPUTED %E\n", flt_c);
}
Я понимаю, что последняя часть в основном проверяет, к которому мощность 2, что можно поднять мантиссу с микросхемой три переменных алгоритма. Как насчет первой части?
Я вижу, что прогрессирование кратных 2 должно в конечном итоге определять значение значащего, но я попытался проследить несколько небольших чисел, чтобы проверить, как он должен работать, и ему не удалось найти правильные значения ...
============================================================================================================================================== ==================================
Каковы концепции, на которых основана эта программа, и эта программа становится более точной, целочисленные числа должны быть найдены?
@TonyK, вычисление 'flt_m' идеально подходит. Он вычисляет один меньше, чем дважды 'flt_m', с осторожностью, чтобы избежать потери точности. И нет ничего плохого в стиле, учитывая, что он написан в K & R C. –
@JohnBollinger С осторожностью, чтобы избежать потери точности. Абсолютно нет, 'flt_m + flt_m - 1' будет ближайшим поплавком до 2 *' flt_m' - 1 для всех значений 'flt_m'. Вместо этого назначение записывается таким образом, чтобы быть самодокументированным («MAX VALUE OF MANTISSA»). –
@PascalCuoq, я полагаю, мы оба размышляем. Тем не менее, я нахожу конструкцию ничего *, но * самодокументирую. Единственная причина для меня, которая имеет для меня смысл, - избегать любого промежуточного результата (например, 2 * 'flt_m'), который хуже, чем единичная точность. Правдоподобно, что, имея такое значение как один вход, сумматор может преобразовать другой в тот же масштаб, прежде чем вычислять их сумму. Реализация, которая сделала это (без повышения точности), могла бы вычислить результат, отличный от желаемого. –