unikanie postaci wykładniczej

0

Witam Was!

Co należy zrobić aby wynik operacji matematycznej w konsoli c# przedstawiać w taki sposób, by wynik nie był w postaci wykładniczej, tzn cała liczba a nie jakaś np 5,1*10^16.

Pozdrawiam!

0

A jak zrobić żeby liczba cyfr po przecinku nie była na sztywno zapisana tylko zmieniła się w zależności od potrzeby ?

np. Console.WriteLine("{0:F} ", 5.1 * Math.Pow(10.0, 16.0));``` / wynik na konsoli  51000000000000000.00 

0

Formatowanie G daje postać wykładniczą 5, 1E + 16 a chodziło o to żeby wynik był w postaci dziesiętnej

0
Zimny Krawiec napisał(a):

Formatowanie G daje postać wykładniczą 5, 1E + 16 a chodziło o to żeby wynik był w postaci dziesiętnej

G jest "ratuj mnie jak możesz - jak nie możesz to wykładniczo". Żeby skontrastować: E jest zawsze wykładnicza (i zawsze się uda), F zawsze stałpopozycjna, jak się nie uda, to kaput.
Gdybym sam implementował 'G', to jednak E+16 nieco "cokolwiek" poza zakresem takiego sensowności formatowania liczb zmiennoprzecinkowych, ja bym już odrzucał.

BTW mówisz o wyniku zmiennoprzecinkowym, double albo float? Konwertowałeś do decimala?

Zimny Krawiec napisał(a):

np. Console.WriteLine("{0:F} ", 5.1 * Math.Pow(10.0, 16.0));``` / wynik na konsoli 51000000000000000.00

Oj Pow'a to bardzo cię proszę, nie używaj w takim kontekście

0

Wynik takiego działania zawsze będzie double bo jaki inny może być ?

Porównaj :
Console.WriteLine("{0:G} ", double.MaxValue);
Console.WriteLine("{0:F} ", double.MaxValue);

0
Zimny Krawiec napisał(a):

Wynik takiego działania zawsze będzie double bo jaki inny może być ?

Porównaj :
Console.WriteLine("{0:G} ", double.MaxValue);
Console.WriteLine("{0:F} ", double.MaxValue);

1,79769313486232E+308
179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,00

Minimalnie za dużo obiecałem. Tym niemniej przykład pokazuje ilość cyfr sensowych. Gdybym to robił jakoś podobnie bym zdecydował. Prezentując te dwieście fałszywych zer czułbym się jak przestępca

Zrewanżuje się takim kodem, ale to tylko akademicko. Rzutując przez decimal nie przybędzie cyfr dokładnych. Temat jest niewłaściwie określony.


 Console.WriteLine("{0:G} ", decimal.MaxValue );
 Console.WriteLine("{0:F} ", decimal.MaxValue );

EDIT. Zawsze mnie odrzucało, jak MS "przyjaźnie" drukował liczby zmiennoprzecinkowe (jak pamiętam MSVC++), na debugerze prezentując uczciwsze choć brzydsze.

0

Dzięki!;-) Spróbuję, chcę się jeszcze czegoś w życiu nauczyć :-)

0

Wszystkich cyfr na konsoli było 311 : 1 + 308 i 2 po przecinku .
Łatwo sprawdzić. Trzeba zaznaczyć na konsoli i skopiować a następnie wkleić do stringu i odczyta właściwość Lenght

0
basup74 napisał(a):

Dzięki!;-) Spróbuję, chcę się jeszcze czegoś w życiu nauczyć :-)

Całe życie, całe życie (i umieramy głupi). :)

F.p. ma dwa problemy. Pierwszy jest dość szeroko znany, dokładności. Drugi jest znany mniej, a tez ważny: reprezentacji. Nie każda liczba ułamkowa czy duża istnieje. Hipotetycznie po 123456789012.0 jest 123456789106.0

0

To prawda, Pod androidem na przykład jest taki sympatyczny kalkulatorek mobi calc;-) który potrafi w mgnieniu oka podnieść np 111^111 i mam wszystkie cyferki, a tak to postać wykładnicza to trochę jakby system na skróty szedł:-). Jak kiedyś chodziłem na politechnikę, w roku bodajże 1993, mieliśmy pascala i komputer, co prawda długo, ale policzył ogromne ciągi liczb:-)

0
basup74 napisał(a):

To prawda, Pod androidem na przykład jest taki sympatyczny kalkulatorek mobi calc;-) który potrafi w mgnieniu oka podnieść np 111^111 i mam wszystkie cyferki, a tak to postać wykładnicza to trochę jakby system na skróty szedł:-). Jak kiedyś chodziłem na politechnikę, w roku bodajże 1993, mieliśmy pascala i komputer, co prawda długo, ale policzył ogromne ciągi liczb:-)

Da się zaimplementować typy z dowolną ilością cyfr dokładnych. Milion lat temu (Jak nie było latwego dostępu internetem do wszystkiego) miałem C/C++ stałoprzecinkowy do starych złotych sprzed denominacji, potem konwersja na nowe złote. Dało się. Dodawanie, odejmowanie bajka, mnożenie, trudniej. Ponieważ to biznes, wystarczało mnożenie przez procent. Dzielenia do końca eksploatacji tej biblioteki nie było, nie było potrzeby.
Obecnie na pewno sa takie biblioteki, a nie miazłem powodu używać (decimale w językach wystarczają)

0

Zgadza się . Można takie typy liczbowe wymyślić ale obliczenia na takich typach mogą trwać bardzo długo.
Działania na liczbach typu double są podobno 10 razy szybsze niż działania na liczbach typu decimal.
Nie będę pisał z czego to wynika ale tak jest .

Ktoś kiedyś policzył ile czasu potrzebowałby najszybszy komputer aby obliczyć wszystkie kombinacje rozegrania pewnej gry .
Najszybszy komputer na świecie musiałby liczyć dłużej niż istnieje wszechświat
Komputery kwantowe - obecnie science fiction mogłyby poradzić sobie z takimi obliczeniami .

1 użytkowników online, w tym zalogowanych: 0, gości: 1