Клас Zero-Акругленне-Памылка ў .NET?

Прывітанне ўсім Мне было цікава, ёсць клас у .NET, які выкарыстоўваецца для вылічэння дакладных лічбаў без памылак акруглення?

Напрыклад, гэта не тое, што я хачу:

decimal dividend = Decimal.One;
decimal divisor = 3;
dividend/divisor * divisor//gives us 0.9999999999999999999999999999 instead of 1

Я думаю, калі ёсць нумар класа, што Буферы аперацыі да калі нам трэба адлюстраваць яго, іншымі словамі, гэта будзе выглядаць наступным чынам:

Num n = new Num(1);
n.DivideBy(3);
n.MultiplyBy(3);
n.toString();//gives us "1"

Num n2 = new Num(n);
n2.DivideBy(3);
int decimal_places = 8;
n2.RoundHalfUp(decimal_places);
n2.toString();//gives us "0.33333333"

Вядома, гэта ўсяго толькі прыклад рэалізацыі. У асноўным галоўнае тут я шукаю для класа, які не мае якіх-небудзь памылак акруглення (звычайна ад затрымкі разлікаў да апошняга моманту).

Я разумею, што прадукцыйнасць будзе павольней, чым Double або Decimal . Але ён не павінен рабіць вылічэнні ўсляпую хутка, пакуль ён знаходзіцца ў межах прымальным час.

2
@RickLiddle Гэта некалькі што. Маё патрабаванне заключаецца ў тым, што ён робіць матэматыку «правільна» (без памылак акруглення), і ў <я> прымальны час. Таму я хацеў бы разгледзець магчымасць адмены, каб спрасціць фармулёўку відавочнае паляпшэнне (робячы гэта тое, як людзі зрабілі б гэта), але не з'яўляецца абавязковым патрабаваннем, да таго часу, як ён робіць разлікі ў прымальным час.
дададзена аўтар Pacerier, крыніца
Ці з'яўляецца алгебраічнай бібліятэка, якая б адмен спрасціць заяву, перш чым вырашыць такія рэчы вы шукаеце? Я не сустракаў адзін, але калі гэта тое, што вы пасля гэтага, можа быць, хтосьці мае нейкае ўяўленне пра ...
дададзена аўтар Rick Liddle, крыніца

3 адказы

Гэта праца для рацыянальных лікаў . Няма неабходнасці адкладаць што-небудзь, калі вы толькі робіце арыфметычныя аперацыі (у тым ліку дзялення).

Калі вам трэба вылічыць адвольныя бесперапынныя функцыі (напрыклад. Лагарыфмы, косінус, квадратныя карані і г.д.), ён становіцца спосаб больш актыўны ўдзел. Адсочванне неабходных лічбаў, каб забяспечыць патрабаваную дакладнасць складана, але, безумоўна, можна выканаць, хоць і неэфектыўным на практыцы. Ідэя заключаецца ў тым, каб захоўваць ўздоўж кожнай функцыі іншай функцыі вылічэнні модуль бесперапыннасці (вы атрымаеце тое, што адзін будзе называюць " інтуіцыйнай бесперапынных функцый").

Звярніце ўвагу, што захоўванне дрэва выразы ня спрашчае справы шмат, так як вам трэба ацаніць атрыманую (спадзяюся прасцей) выраз.

Іншы падыход будзе захоўваць спаважнаю шэраг разам з радыусам збежнасці, і вылічыць суму шэрагу па запыце.

7
дададзена
@AlexandreC. дзякуй гэта добры матэрыял, я хацеў бы зрабіць некаторыя даследаванні на спасылкі/класа.
дададзена аўтар Pacerier, крыніца
Re «Адсочванне неабходных лічбаў, каб забяспечыць патрабаваную дакладнасць»: мне здаецца, запытаная дакладнасць бясконцая.
дададзена аўтар svick, крыніца
@svick: ідэя заключаецца ў тым, што вы толькі запытаць дакладнасць у канцы разліку (напрыклад, пры адлюстраванні нумары.). На дадзены момант, усё вылічаецца (выгляд дрэва захоўваецца па шляху), і неабходныя лічбы для кожнага подвыражения вылічаюцца рэкурсіўна. Гэта даволі лёгка рэалізаваць у функцыянальных мовах. Лікі прадстаўляюцца ў выглядзе функцый, якія прымаюць цэлы лік п і вярнуць рацыянальнае лік у межах 2 ^ {- п} прадстаўляемага ліку (тыя сапраўды <я> дакладна сапраўдныя лікі!). Хтосьці дасведчаны ў F # можа даць яму паспрабаваць.
дададзена аўтар Alexandre C., крыніца
Праблема заключаецца ў тым, што роўнасць з'яўляецца невырашальным для гэтых лікаў.
дададзена аўтар Alexandre C., крыніца
@Pacerier: калі вы не пярэчыце, матэматыку, і гатовыя трываць некаторыя Haskell, у вас ёсць некаторы рэсурс там: дададзена аўтар Alexandre C., крыніца

Ваша канкрэтная праблема можа быць вырашана з дапамогай такога тыпу, які можа прадстаўляць любую частку дакладна. Вы можаце выкарыстоўваць бібліятэку для гэтага ці напісаць яго самастойна (гэта не павінна быць так складана).

Але калі вы хочаце, каб вырашыць агульную праблему, так што Math.pow (Math.Sqrt (2), 2) == 2 вяртае True і што працуе для любых аперацый , вам трэба будзе тып, які можа прадстаўляць любыя вылічэнні і быць у стане надзейна спрасціць. Проста затрымліваючы разлік не дастаткова.

Я не ўпэўнены, што нешта падобнае існуе, ці што гэта наогул магчыма.

1
дададзена
Так, вы атрымліваеце кропку тут, што я спрабую сказаць, што ён «не павінен быць вельмі разумным», але да таго часу, як гэта «як чалавек», гэта выдатна. (Напрыклад, чалавек можа лёгка сказаць, што Math.pow Math.Sqrt з'яўляецца скарачальнасці)
дададзена аўтар Pacerier, крыніца

Магчыма, адвольнай дакладнасць цэлай бібліятэка будзе дастаткова для вашых патрэб?

Спасылачныя адказ мае справу з C#, але, вядома, яны сапраўды агульныя .NET адказаў.

0
дададзена