После обновления Windows некоторые расчетные значения изменились в последней цифре, например от -0.0776529085243926 до -0.0776529085243925. Изменение всегда уменьшается на единицу, и это касается как четных, так и нечетных чисел. Похоже, это связано с KB4486153, поскольку при возврате этого обновления значения возвращаются к предыдущим.
Это изменение можно увидеть уже при отладке в Visual Studio и наведении курсора на переменную. Позже значение записывается в выходной файл и также изменяется в нем (без запуска отладчика).
Минимально воспроизводимый пример
var output = -0.07765290852439255;
Trace.WriteLine(output); // This printout changes with the update.
var dictionary = new Dictionary<int, double>();
dictionary[0] = output; // Hover over dictionary to see the change in debug mode
Фон
Расчетное значение исходит из
output[date] = input[date] / input[previousDate] - 1;
Не обращая внимания на потерю точности в арифметике с плавающей запятой, я могу произвести вычисления в окне «Немедленное» и получить -0.07765290852439255
как до, так и после обновления.
Однако при наведении указателя мыши на переменную output
я вижу {[2011-01-12 00:00:00, -0.0776529085243926]}
перед обновлением и {[2011-01-12 00:00:00, -0.0776529085243925]}
после, и эта разница также распространяется на выходной файл.
Кажется, что вычисленное значение одинаково до и после обновления, но его представление округляется по-разному.
Входные значения:
{[2011-01-11 00:00:00, 0.983561000400506]}
{[2011-01-12 00:00:00, 0.907184628008246]}
Целевая платформа установлена на .NET Framework 4.6.1
Вопрос
Могу ли я что-то сделать, чтобы сохранить прежнее поведение, сохранив обновления?
Я знаю о потере точности вычислений с плавающей запятой, но почему это изменение происходит после обновления и как мы можем гарантировать, что будущие обновления не изменят представление значений?
KB4486153 - это обновление для Microsoft .NET Framework 4.8, см. https://support.microsoft.com/en-us/help/4486153/microsoft-net-framework-4-8-on-windows-10.-version-1709-windows-10-vers
double v = -0.07765290852439255; Trace.WriteLine(v);
, не так ли? - person Ben Voigt   schedule 21.08.2019BitConverter.Int64BitsToDouble
Затем ясно, что разница заключается в преобразовании строки из одного и того же числового представления. - person Ben Voigt   schedule 21.08.2019