C# деление на ноль для двойников-comvisible-infinity vs. Исключение dividebyzeroexception
Уважаемые Эксперты
У меня есть сборка .net COMVisible, которая выполняет некоторые вычисления с двойными числами, а также деления. Итак, допустим, дело доходит до такой ситуации:
double a= 250.0; double b= 0.0; double c= a / b;
а) использование сборки из приложения .net
В этом случае результат деления похож на ожидаемый
c= Infinity;
б) использование _одинаковый_ сборка по COM из собственного приложения W32
В этом случае деление приводит к
DivideByZeroException
[Edit0]это происходит также только в том случае, если происходит внутренняя сборка x/0.0, без возврата (маршалинга) этого результата обратно в W32. [/Edit0]
[Edit1]некоторая предыстория, почему это меня беспокоит: мы пытаемся шаг за шагом перейти от W32 к .NET. В промежуточном временном интервале мы хотели бы использовать новые сборки .NET также в устаревшем приложении [/Edit1]
Во-первых, это было очень удивительно для меня, но я могу понять, что это, возможно, связано с W32 - "хостом".
Вопрос: есть ли у кого-нибудь идея позволить вести себя сборке всегда одинаково, желательно, чтобы деление на 0.0 дало результат
Infinity
?Заранее большое вам спасибо за некоторые подсказки.
Что я уже пробовал:
Много гуглил, но безуспешно.
F-ES Sitecore
То, что делится на ноль, не является бесконечностью, поэтому результат правильный. Если вы хотите, чтобы деление на ноль вернуло что-то конкретное, вам нужно будет встроить это в код
если (b = = 0)
return customValue
еще
возврат a/b
0x01AA
- Нет, извини. По определению в c# деление x/0.0 заканчивается на бесконечность / NaN. Я в порядке с этим, но что меня беспокоит, так это то, что в случае, если я использую сборку .net из приложения .net, это похоже на это, но когда я использую _same_assembly by COM, он выдает исключение :(
И нет, я никогда не проверю b==0.0
, потому что подобное может произойти, если a
очень большой (например, Макс двойной) и b= 10E-127
F-ES Sitecore
Я никогда не знал, что c# не бросает ошибку деления на ноль.
0x01AA
Это так для double
, но не для int или Decimal
В любом случае, спасибо за ВАШ интерес к этому вопросу.
Кроме того, это в c# не вызывает исключения (за исключением случаев, используемых COM):
двойной a = двойной.Максвеллову;
двойной b = 1.0 / a;
двойной c = a / b;
F-ES Sitecore
Только что проверил, и вы правы, я, очевидно, не очень часто использовал двойники :)
Проблема может заключаться в сортировке бесконечности для потребителя COM, возможно, она не может быть упорядочена, поэтому вместо этого бросает деление на ноль, хотя это всего лишь предположение.
0x01AA
Это также не является вещью упорядочивания. На данный момент x/0.0 не возвращается в приложение W32, это только промежуточный результат... который в конечном итоге заканчивается com-исключением из представления приложения W32 :-)
Richard MacCutchan
Попробуйте мой пример кода ниже.
0x01AA
Да, это действительно подтверждает, что c# не исключение. С, D, Е все имеют значение Infinity
.
Спасибо, Бруно
Richard Deeming
Может быть, это флаги с плавающей запятой в вызывающем приложении?
Двойное деление на ноль возвращает ошибку деления на ноль[^]
(Не совсем то же самое, что и ваша проблема, но звучит похоже.)
0x01AA
Просто проверить. Это действительно работает (означает, что div по нулевым результатам теперь находится в бесконечности) на первый взгляд, если я позвоню, например
_clearfp();
Функции _fpreset();
в конструкторе видимой сборки COM. Пока все идет хорошо, теперь мне нужно проверить, как это влияет на мое приложение W32 :)
Большое вам спасибо за этот намек!
И если вы опубликуете его в качестве ответа, я приму его, даже если он не решит мою проблему, но ответит на мой вопрос :-)
Еще раз большое вам спасибо.
Бруно