Получить дробную часть из суммы с плавающей точкой - PullRequest
0 голосов
/ 03 мая 2020

Скажем, у нас есть следующая сумма с плавающей точкой:

xa + yb = z. c

Я заинтересован в получении "реальной" дробной части результата Суммируйте "c" как можно точнее. Он не может быть точно получен с использованием по сумме по модулю 1.

То, что я имею до сих пор, это использование шага от KahanSum, чтобы получить неточность суммы, а затем добавить неточную дробную часть суммы, чтобы получить точная дробь (https://en.wikipedia.org/wiki/Kahan_summation_algorithm)

function FractionOfSum(float x, float y)
  var t = x + y
  var c = (t - x) - y
  return c + (t % 1)

Тот же код в C#

float FractionOfSum(float x, float y)
{
    float t = x + y;
    float c = (t - x) - y;
    return c + (t % 1);
}

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

Почему бы просто не добавить "a" и "b" и не взять часть этого? Поскольку c не равно (a + b)% 1 в некоторых случаях, таких как -11,8 + 12,4 = 0,6

Редактировать: для отрицательного числа дробь также должна быть отрицательной

...