Во-первых, мы должны отметить, что в плавающей точке IEEE754 1.5
, 0.5
и 2.0
все представлены в точности.Таким образом, в этом конкретном примере 1.5
никогда не будет 1.499999999999
.
Сказав это, я думаю, что нужно сделать, чтобы выставить ваших учеников на номера не точно представимые,Скажи, 1.1
.
Вот пример программы:
#include <iostream>
#include <iomanip>
int main() {
std::cout << std::setprecision(30);
double d1(1.1);
std::cout << d1 << "\n";
double d2(11);
double eps = d2/10 - d1;
std::cout << d2 << "\n";
std::cout << eps << "\n";
bool equal = (d1 == d2);
std::cout << equal << "\n";
}
Возможно, вы сможете пройти их через эту программу, стараясь сказать, что d1
и d2
оба приблизительно равно 1.1.
Для продвинутых студентов вы можете пройти дробную двоичную арифметику и понять, почему 1/2
представимо, а 1/10
нет.
РЕДАКТИРОВАТЬ: Я думаю, что путьСуть в том, чтобы сравнить повторяющиеся десятичные дроби с повторяющимися двоичными дробями.Покажите своим ученикам 1/7
в десятичном виде.Делайте длинные деления на доске.Укажите, что вы не можете записать 1/7
точно, используя ограниченные ресурсы.Затем либо покажите им, как записать 1/10
в виде двоичной дроби, либо просто скажите им, что вы не можете записать это либо с использованием конечных ресурсов.
Укажите, что числа с плавающей точкой конечны (32 бита) идвойные числа конечны (64 бита).Возможно, представьте принцип голубя и скажите, что вы не можете представить бесконечное множество (как все рациональные числа) в конечной длине слова.
Что бы вы ни пытались, сообщите об этом здесь и дайте нам знать, как это работает.