У меня есть функция, для которой я не могу изменить синтаксис, скажем, это какая-то библиотечная функция, которую я вызываю:
void schedule(double _val);
void caller() {
uint64_t value = 0xFFFFFFFFFFFFFFF;
schedule(value);
}
поскольку расписание функции принимает тип аргумента double, в случаях, когда значение аргумента превышает 52 бита (учитывая, что double хранит мантиссу как 52-битное значение), я теряю точность в таких случаях.
что я намереваюсь сделать, так это, если значение больше, чем максимальное значение, которое может удерживать двойное число, мне нужно выполнить цикл для оставшегося значения, чтобы в конце концов оно суммировалось с правильным значением.
void caller() {
uint64_t value = 0xFFFFFFFFFFFFFFF;
for(count = 0; count < X ; count++) {
schedule(Y);
}
}
мне нужно извлечь X и Y из переменной «значение». Как этого можно достичь? Моя цель - не потерять точность из-за приведения типов.
schedule(x+y)
совпадает сschedule(x);schedule(y);
? - person Marc Glisse   schedule 01.04.2013schedule
можно заменить несколькими последовательными вызовамиschedule
. Однако вы не объяснили, как производится такая замена. Каково правило замены в этом случае? Какой инвариант необходимо поддерживать? Сумма аргументов должна остаться прежней? Или что-то другое? Не зная этого, невозможно понять, откуда берутся вашиX
иY
и что они должны означать. - person AnT   schedule 01.04.2013schedule(Y);
эквивалентныschedule(X*Y);
. Мы хотели бы узнать кое-что более общее: эквивалентно лиschedule(A); schedule(B);
schedule(A+B);
, если предположить, что A и B неотрицательны, аA+B
можно вычислить и передать точно, без ошибок округления или других арифметических проблем? Даже если A или B очень большие (например,1u<<63
), до тех пор, пока они передаются без ошибок? - person Eric Postpischil   schedule 01.04.2013schedule
передается большое значение, например 2 ** 63, и оно передается точно, без ошибок, работает лиschedule
или нет? - person Eric Postpischil   schedule 02.04.2013