Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Как работать с числами с плавающей точкой не используя float double типы данных?

#c


Например в стандартный поток ввести число(с плавающей точкой) +число(с плавающей
точкой)  и вывести результат (число с плавающей точкой)  не используя float, double 
    


Ответы

Ответ 1



Операции сложения и вычитания тривиально переносятся на концептуальное представление с фиксированной точкой. То есть число 123.456 можно представлять как целое число 123456, а число 789.123, как число 789123. Сумма этих чисел, с правильно поставленной точкой (три цифры справа), даст вам правильный ответ на вопрос о сумме исходных чисел 123.456 и 789.123. Другими словами, все плавающие числа в таком подходе превращаются в целые через умножение на какой-то фиксированный множитель M (1000 в моем примере) и последующее округление. При этом тривиальным образом сохраняется корректность операций сложения и вычитания. Операция умножения для таких чисел также реализуется достаточно тривиально - надо выполнить целочисленное умножение и просто разделить его результат на множитель M. Операция деления реализуется путем предварительного умножения делителя на M и последующего выполнения целочисленного деления. Схематично (Внимание: Чтение чисел через scanf будет работать неправильно на некоторых входах. Чтобы корректно прочитать дробную часть понадобится несколько более сложный код.) #include #define M 1000 int main(void) { unsigned long long a, b, c, w, f; // Читаем `a` scanf("%llu.%3llu%*[0-9]", &w, &f); while (f >= M) f /= 10; a = w * M + f; // Читаем `b` scanf("%llu.%3llu%*[0-9]", &w, &f); while (f >= M) f /= 10; b = w * M + f; // Сложение - это обычное сложение c = a + b; // Выводим результат printf("%llu.%03llu + %llu.%03llu = %llu.%03llu\n", a / M, a % M, b / M, b % M, c / M, c % M); // Умножение - это обычное умножение с пост-коррекцией c = a * b / M; // Выводим результат printf("%llu.%03llu * %llu.%03llu = %llu.%03llu\n", a / M, a % M, b / M, b % M, c / M, c % M); } http://coliru.stacked-crooked.com/a/acbf006dde1e16b6

Комментариев нет:

Отправить комментарий