Я пытаюсь проверить, если double
переменная p
примерно равно целому числу. В какой-то момент в моем коде у меня есть
double ip;
cout << setprecision(15) << abs(p) << " " << modf(abs(p), &ip) << endl;
И для данного прогона я получаю распечатку
1 1
Кажется, это говорит о том, что дробная часть 1 равна 1, я что-то здесь упускаю или может быть какая-то проблема округления и т. Д.?
Примечание: я не включаю весь код, так как происхождение p
это сложно, и я просто спрашиваю, является ли это знакомой проблемой
может быть какая-то проблема округления и т. д.?
Там наверняка могли. Если значение очень немного меньше 1, то и его значение, и его дробная часть могут быть округлены до 1 при отображении.
происхождение
p
это сложно
Тогда, скорее всего, это не будет точное круглое число.
Вы тестируете значение, близкое к 1, поэтому точности 15 недостаточно для однозначного описания.
Этот код ясно показывает вашу проблему:
#include <iostream>
#include <iomanip>
#include <cmath>
#include <limits>
using namespace std;
int main() {
double ip, d = nextafter(1., .0); // Get a double just smaller than 1
const auto mp = std::numeric_limits<double>::max_digits10;
cout << 15 << ": " << setprecision(15)
<< abs(d) << " " << modf(abs(d), &ip) << '\n';
cout << mp << ": " << setprecision(mp)
<< abs(d) << " " << modf(abs(d), &ip) << '\n';
}
По колиру: http://coliru.stacked-crooked.com/a/e00ded79c1727299
15: 1 1
17: 0.99999999999999989 0.99999999999999989