Math.Net Complex32 Division дава NaN

Добре, имам две големи комплексни стойности. Отгоре и отдолу:

Най-горе = 4.0107e+030

Bot = 5.46725E26 -2.806428e26i

когато разделя тези две числа в Complex32 на Math.Net, това ми дава NaN както за real, така и за имагинрей. Предполагам, че има нещо общо с прецизността.

Когато използвам Matlab, получавам следното:

Горе/Долу = 5.8060e+003 +2.9803e+003i

Когато използвам System.Numerics, получавам нещо много близко до matlabs, поне в правилния ред на величина:

Горе/Долно = +5575.19343780947 +2676.09270239214i System.Numerics.Complex

чудя се кой е правилният? и защо Math.Net ми дава грешен отговор. Правя симулации и много ме е грижа за точността на числата? Все пак да поправя това? ще се занимавам с много големи комплексни числа.

Освен това, ако някой знае за добра библиотека Complex за .net с поддръжка на специални функции, като функцията за допълваща грешка и функцията за грешка на параметрите на Complex, това би било чудесно. Както разбрах, че Math.Net не поддържа cerf на комплекс32


person zellwwf    schedule 18.08.2013    source източник
comment
Гледайки като реални и въображаеми, изглеждат плувки с единична точност в Complex32, точността на целувката, освен като процентно приближение, довиждане.   -  person Tony Hopkinson    schedule 18.08.2013
comment
да, знам, все още не отговаря на някои въпроси. System.Numerics.Complex също е 32, но дава отговори. макар и много по-различен от този на matlab, имате ли някакви предложения или трябва да прибягна до написването на моя собствен. Което няма да е добро представяне.   -  person zellwwf    schedule 18.08.2013
comment
Или може би неправилно използвам библиотеката?   -  person zellwwf    schedule 18.08.2013
comment
Не мога да измисля причина, поради която трябва да дадат същия отговор, освен изключителното богатство. Но да, или живейте с липсата на точност, или превъртете свой собствен клас комплексни числа, базиран на числа с фиксирана точка.   -  person Tony Hopkinson    schedule 18.08.2013
comment
System.Numerics.Complex (и еквивалентът в MathNet.Numerics в portable, където System.Numerics не е наличен) е с двойна точност, следователно 2x64bit.   -  person Christoph Rüegg    schedule 19.08.2013


Отговори (1)


Ако държите на точността, очевидно трябва да използвате двойна точност/64-битов тип, а не единична точност/32-битов. Обърнете внимание, че предоставяме само тип Complex32, но не и тип Complex (64) в нормалния пакет, защото искаме да използвате типа Complex, предоставен в System.Numerics за съвместимост - ние предоставяме само еквивалентен тип Complex (64) в преносимата компилация като System.Numerics не е наличен там.

Но в този конкретен случай това не е проблем с прецизността (или точността), а с обхвата. Не забравяйте, че 32-битовите числа с плаваща запетая не могат да бъдат по-големи от ~3,4e+38. Изчисляването на сложно деление в нормална директна форма изисква изчисляване на квадрат както на реални, така и на имагинерни компоненти на знаменателя, който във вашия случай ще излезе извън диапазона и ще стане "безкрайност" и по този начин NaN в крайния резултат.

Сега може да е възможно да се приложи делението във форма, която избягва изчисляването на квадрат, когато знаменателят е по-голям от около 1e+19, но все още не сме направили това в Math.NET Numerics (тъй като нямаше търсене за него до сега). Това също не би било проблем, ако сложният тип прилага полярната форма, но това е доста необичайно.

person Christoph Rüegg    schedule 18.08.2013