Недавно я задумался об умножении чисел с плавающей запятой.
Предположим, у меня есть число, например 3,1415, с гарантированной точностью до трех цифр.
Теперь я умножаю это значение на 10 и получаю 31,415X, где X — цифра, которую я не могу определить из-за ограниченной точности.
Могу ли я быть уверен, что пятерка переносится на точные цифры? Если доказано, что число является точным до 3 цифр, я бы не ожидал, что эта пятерка всегда будет там появляться, но после изучения многих случаев в С++ я заметил, что это всегда происходит.
С моей точки зрения, однако, это не имеет никакого смысла, потому что числа с плавающей запятой хранятся по основанию два, поэтому умножение на десять на самом деле невозможно, это всегда будет умножение на 10.что-то.
Я задаю этот вопрос, потому что хотел создать функцию, вычисляющую точность типа. Я придумал что-то вроде этого:
template <typename T>
unsigned accuracy(){
unsigned acc = 0;
T num = (T)1/(T)3;
while((unsigned)(num *= 10) == 3){
acc++;
num -= 3;
}
return acc;
}
Теперь это работает для любых типов, с которыми я его использовал, но я все еще не уверен, что первая неточная цифра всегда будет переноситься в неизменном виде.