2013-08-18 2 views
1

Хорошо, поэтому у меня есть два больших комплексных значения. Вверх и Вниз:Math.Net Complex32 Отдел, дающий NaN

Top = 4.0107e + 030

Bot = 5.46725E26 -2.806428e26i

, когда я разделить эти два числа в Complex32 Math.Net, это дает мне NaN для обоих реальный и воображаемый. Я предполагаю, что он имеет какое-то отношение к точности.

Когда я использую Matlab я получаю следующее:

Top/Бота = 5.8060e + 003 + 2.9803e + 003i

Когда я использую System.Numerics я получить что-то очень близкое к matlabs, по крайней мере, в правильном порядке magnitute:

Top/Bot = +5575,19343780947 + 2676.09270239214i System.Numerics.Complex

я удивляюсь, что один является правильным? и почему Math.Net дает мне неправильный ответ Я запускаю симуляции, и я очень забочусь о точности чисел? В любом случае, чтобы исправить это? я буду иметь дело с большим количеством больших комплексных чисел.

Плюс, если кто-нибудь знает о хорошей комплексной библиотеке для .net с поддержкой специальных функций, таких как функция комплексной ошибки и функция ошибок сложных параметров, это было бы здорово. Как я узнал, что Math.Net не поддерживает cerf complex32

+0

Видя, как реальные и мнимые кажутся одними точными поплавками в Complex32, точность поцелуев, кроме как в процентах приближения до свидания. –

+0

Да, я знаю, все равно не отвечаю на некоторые вопросы. System.Numerics.Complex также 32, но предоставлены ответы. хотя и сильно отличается от Matlab, есть ли у вас какие-либо предложения или я должен прибегать к написанию своих собственных. Который не будет хорошей производительностью. – zellwwf

+0

Или, может быть, я неправильно использую библиотеку? – zellwwf

ответ

0

Если вам небезразлична точность, вы, очевидно, должны использовать тип двойной точности/64 бит, а не одну/32-битную. Обратите внимание, что мы предоставляем только Complex32, но не Complex (64) в нормальном пакете, потому что мы хотим, чтобы вы использовали тип Complex, предоставленный в System.Numerics, для совместимости - мы предоставляем эквивалентный тип Complex (64) в переносной сборке как System.Numerics там недоступно.

Но в данном конкретном случае это не проблема точности (или точности), а диапазона. Помните, что 32-битные числа с плавающей запятой не могут быть больше ~ 3.4e + 38. Вычисление комплексного деления в нормальной прямой форме требует вычисления квадрата как реальной, так и мнимой компонент знаменателя, которая в вашем случае выйдет за пределы диапазона и станет «бесконечностью» и, следовательно, NaN в конечном результате.

Теперь возможно реализовать деление в форме, позволяющей вычислять квадрат, когда знаменатель больше, чем около 1e + 19, но мы еще не сделали этого в Math.NET Numerics (так как не было спрос на него до сих пор). Это также не будет проблемой, если сложный тип будет реализовывать полярную форму, но это довольно редко.

Смежные вопросы