cbool10 Temat założony przez niniejszego użytkownika |
[C] Wpisywanie do tablicy liczby z X miejscami po przecinku » 2014-06-15 16:25:20 Witam wszystkich. Czy da się wpisać w tablicy lub określić że wpisana liczba ma mieć np. 1 miejsce po przecinku? Piszę program w którym istotne jest to żeby na np 10 czy 20 miejscu po przecinku nie pojawiały się jakieś "krzaki" w postaci niechcianych liczb bo psuje to wyniki. Zamiast brak rozwiązania pokazuje jakieś rozwiązanie. |
|
killjoy |
» 2014-06-15 16:56:52 Pierwsza myśl: #include <stdio.h> #include <math.h>
float setPrecision( float Var, size_t precision ) { long long divideBy = pow( 10, precision ); long long res = Var * divideBy; return res /( float ) divideBy; }
int main() { printf( "%f", setPrecision( 4.1234567f, 2 ) ); }
Ale pamiętaj, że śmieci będą zawsze przy niektórych liczbach, bo liczby rzeczywiste są zapisywane jako potęgi 2, a nie 10. |
|
cbool10 Temat założony przez niniejszego użytkownika |
» 2014-06-15 17:21:50 To chyba nie do końca to o czym myślę. Jak tym twoim kodzie w funkcji printf dam żeby wyświetlił 10 miejsc po przecinku to jest tak 4,1199998856a mi zależy na tym żeby tak wyświetlona liczba miała 4,1200000000 i żeby w działaniu została użyta liczba 4,12 a nie np. 4,12000000000000003 bo to już zmienia diametralnie pozostałe wyniki co powoduje wyświetlanie kompletnych bzdur. |
|
killjoy |
» 2014-06-15 17:39:35 Najwyraźniej float ma za małą precyzję, użyj double (wszędzie nie tylko w moim kodzie). Czyli w tym przypadku, o ile masz zamiar używać mojej funkcji, będzie to wyglądało jakoś tak: double setPrecision( double Var, size_t precision ) { long long dividedBy = pow( 10, precision ); long long res = Var * dividedBy; return res /( double ) dividedBy; }
A, i przy wywołaniu usuń f po liczbie :D |
|
Elaine |
» 2014-06-15 17:46:47 Czy da się wpisać w tablicy lub określić że wpisana liczba ma mieć np. 1 miejsce po przecinku? Piszę program w którym istotne jest to żeby na np 10 czy 20 miejscu po przecinku nie pojawiały się jakieś "krzaki" w postaci niechcianych liczb bo psuje to wyniki. | boost::cpp_dec_float |
|
killjoy |
» 2014-06-15 17:47:33 @UP Autor pyta o C. |
|
Elaine |
» 2014-06-15 17:53:51 To niech zacznie używać C++, bo nie ma żadnego racjonalnego powodu, by używać C, jeśli na daną platformę istnieje kompilator C++. A nawet jeśli to koniecznie musi być C, to wtedy może sobie ukraść tamtejsze algorytmy (które są dokładniejsze, niż jakikolwiek ogólnodostępny format liczb zmiennoprzecinkowych — a przecież "piszę program w którym istotne jest to żeby na np 10 czy 20 miejscu po przecinku nie pojawiały się jakieś "krzaki""!). To czysta matematyka, przetłumaczenie tego na C nie powinno stanowić większego problemu. Można zamiast tego użyć http://www.mpfr.org/. |
|
cbool10 Temat założony przez niniejszego użytkownika |
» 2014-06-15 18:05:38 killjoypl Jest lepiej ale :) Wyświetlenie 20 miejsc po przecinku ukazuje na 16 miejscu wartość 1. Wiem że marudzę ale h(x)=3√(log5(x^2−√x)) (duży pierwiastek jest 3 stopnia nie 3*√) i zakresie x od -5 do 10 z krokiem co 0.2 taka 1 na 16 miejscu powoduje że 0 to już nie 0 i pojawia się dosyć istotny błąd tzn. brak wyniku(pomimo że coś powinno być) lub wyświetlenie wyniku(pomimo że go nie powinno być).
W swoim kodzie mam typ jako double i to jest jeszcze za mało dokładne.
Teraz zastanawiam się czy może da się to trochę inaczej ugryźć. Zamiast dokładną liczbę wpisywać do tablicy to może dało by radę pobierać liczbę z tablicy zaokrągloną do jednego miejsca po przecinku i wykorzystywanie takiej do obliczeń. Czy jest taka opcja?
Alueril Niestety jestem "zmuszony" przez wykładowce. |
|
« 1 » 2 3 |