Предположим, что у меня есть три целых числа, x, y и w. Мне нужно решить уравнение x/y = z/w
для z. (Одним из наиболее общей потребности для этого является преобразованием некоторой доли в проценты:. x = 20, y = 40, 20/40 = z/100
)Как можно решить уравнение x/y = z/w для z, используя целочисленную арифметику?
Просто вычисление это как z = x/y * w
с использованием целых чисел всегда будет производить 0, когда y > x
и будет производить неточные ответы, когда когда нет. Вычисляя это как z = x * w/y
, вы получите неправильные ответы из-за переполнения при больших значениях x или w даже тогда, когда x < = y.
Очевидным решением является передача входов в плавающую точку, а затем выход обратно в целое число, но это кажется довольно распространенной проблемой, чтобы иметь более инновационные решения, чем это.
Также: что, если w - это больше, чем максимальное отображаемое значение, например. для uint
, w = 2^32
? Может ли это быть выражено с использованием только целочисленной математики?
Я нашел, что для случая, когда 'y <= w' и' abs (x) <= y' - то, что является самым важным для меня прямо сейчас, можно точно вычислить как 'x * (w/y) + ((w% y)/(y/x)) ' – Pineapple
В случае, когда' w = uint.max + 1' и 'abs (x)
Pineapple
Обращение с футляром, в котором y> w нелегко выработать проклятие – Pineapple