Округление не согласуется после математики с плавающей запятой - PullRequest
2 голосов
/ 29 мая 2019

Возьмем следующий пример (с надуманными числами):

double a = 9.0, b = 2.0;
double c = a / b;
int d = RoundAndCastToInt(c);

При нескольких прогонах значение d не согласовано.Вот два надуманных способа выполнения математики:

Выполнение 1:

9.0 / 2.0 == 4.49999 ...

RoundAndCastToInt(4.49999 ...) == 4

Выполнение 2:

9.0 / 2.0 == 4.5

RoundAndCastToInt (4.5) == 5

Я хочу получить одно и то же значение последовательно для разных исполнений и разных машин.В приведенном выше примере результат либо 4, либо 5 является хорошим, если он равен всегда 4 или всегда 5.

1 Ответ

0 голосов
/ 29 мая 2019

Это может быть глупо с большим количеством нерешенных деталей, но я думаю, что это может сработать, когда вы знаете точность решения, которое вы хотите ...

#include <stdio.h>
#include <math.h>

int main(int argc, char * argv[]) {
  float i = 5.3 / 4.7;
  float j = 5.3 / 4.7;

  printf("i %f \n", round(i * 10000.0) / 10000.0);
  printf("j %f \n", round(j * 10000.0) / 10000.0);


  return 0;
}
...