Мои экстрасенсорные способности не велики, и трудно понять, что происходит, фактически не отлаживая их. Но вот предположение. Вопрос, который я обсуждаю здесь:
Почему этот расчет с плавающей запятой дает разные результаты на разных машинах?
относится не только к «кросс-машине», но и к «отладке против выпуска». Это не только возможно, но и вероятно, что версия выпуска вашей программы использует более точную математику , чем ваша версия отладки. Если у вас есть ошибки с плавающей запятой, то вполне возможно, что просто по счастливой случайности вы исправляете ошибки только в версии с более высокой точностью, а не в версии с отладкой с низкой точностью.
Почему разница? Потому что в неоптимизированной версии компилятор C # часто генерирует код для временных значений, как если бы они были локальными переменными; затем джиттер фактически выделяет временные локальные объекты в стеке и записывает временные значения из регистров в локальные. Затем, когда он нуждается в них, он считывает их обратно в регистры из временных. Это путешествие может привести к тому, что значение, которое было в высокоточном регистре, будет усечено до 64-битной точности, теряя биты точности.
В оптимизированной версии компилятор C # и джиттер работают усерднее, чтобы постоянно хранить все в регистрах, потому что, очевидно, это быстрее и с большей точностью, но сложнее в отладке.
Удачи. Ошибки, которые воспроизводятся только в режиме релиза, являются общей болью.