Фмод говорит мне, что дробная часть 1 равна 1

Я пытаюсь проверить, если double переменная p примерно равно целому числу. В какой-то момент в моем коде у меня есть

double ip;
cout << setprecision(15) << abs(p) << " " << modf(abs(p), &ip) << endl;

И для данного прогона я получаю распечатку

1 1

Кажется, это говорит о том, что дробная часть 1 равна 1, я что-то здесь упускаю или может быть какая-то проблема округления и т. Д.?

Примечание: я не включаю весь код, так как происхождение p это сложно, и я просто спрашиваю, является ли это знакомой проблемой

1

Решение

может быть какая-то проблема округления и т. д.?

Там наверняка могли. Если значение очень немного меньше 1, то и его значение, и его дробная часть могут быть округлены до 1 при отображении.

происхождение p это сложно

Тогда, скорее всего, это не будет точное круглое число.

2

Другие решения

Вы тестируете значение, близкое к 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
2

По вопросам рекламы [email protected]