#include <iostream>
#include <cmath>
#include <iomanip>
int main()
{
using std::cout;
using std::endl;
const long double be2 = std::log(2);
cout << setprecision (50)<<std::log(8.0)<<"\n";
cout << setprecision (50)<<std::log(8.0L)<<"\n";
cout << setprecision (50)<<std::log(8.0) / be2 << ", " << std::floor(std::log(8.0) / be2)
<< endl;
cout << setprecision (50)<< std::log(8.0L) / be2 << ", " << std::floor(std::log(8.0L) / be2)
<< endl;
return 0;
}
Вывод:
2.0794415416798357476579894864698871970176696777344
2.0794415416798359282860714225549259026593063026667
2.9999999999999998397549189066424446536984760314226, 2
3.0000000000000001003971211721577105890901293605566, 3
Если вы проверите вывод здесь , вы заметите, что есть небольшая разница в точностииз двух выходов.Эти ошибки округления обычно включаются при операциях на float & double здесь при выполнении floor()
, и результаты, которые появляются, не такие, какими, по их мнению, они должны быть.
Важно запомнить два атрибута Precision & Округление при работе с числами с плавающей запятой или двойными числами.
Возможно, вы захотите узнать больше об этом в моем ответе здесь , то же самое рассуждение применимо и здесь.