andrzejek97 Temat założony przez niniejszego użytkownika |
zapis inżynierski » 2016-11-12 13:49:58 Witam, mam pewien problem, nie wiem jak zapisać łańcuch formatujący dla instrukcji printf tak aby wyświetlała ona zmienna typu double w zapisie inżynierskim, wiem, że dla zapisu naukowego byłoby to %e, nie wiem natomiast co zrobić, aby w wykładniku była zawsze wielokrotność trójki. |
|
DejaVu |
» 2016-11-13 10:13:15 A jest w ogóle taki? |
|
Rashmistrz |
» 2016-11-13 15:21:31 |
|
DejaVu |
» 2016-11-15 16:02:27 @Rashmistrz: miałem na myśli to, czy jest w ogóle możliwość zmiany podstawy notacji naukowej. |
|
Rashmistrz |
» 2016-11-15 23:25:42 @DejaVu: czy jest w ogóle możliwość zmiany podstawy notacji naukowej. |
Najczęściej zmienia się go pod konkretny system liczbowy. Dla dziesiętnego jest to dziesięć, ale dla szesnastkowego dziesięć już nie będzie pasowało. Dlatego dla szesnastkowego jest szesnaście. Dla ósemkowego osiem, dla trójkowego trzy, dla dwójkowego dwa. Czyli kolejno zapisane dla tych systemów podstawy: 10 10, 10 16, 10 8, 10 3, 10 2, ... Jednak nie można zmieniać podstawy w notacji wykładniczej na inną niż baza aktualnie wykorzystywanego systemu liczbowego, bo założeniem jest, że wykładnik jest liczbą całkowitą, a my potrzebowalibyśmy wykładnika rzeczywistego wtedy. W postaci inżynierskiej podstawa nie ulega zmianie, a założeniem jest, że wykładnik jest wielokrotnością lub podwielokrotnością liczby 3. To wymaga od nas znormalizowania mantysy tej notacji do przedziału [1,1000). Nigdy nie spotkałem się z taką możliwością formatowania liczby w bibliotece standardowej C++. |
|
DejaVu |
» 2016-11-16 17:43:05 Grunt to wymyślać głupie wartości i nazywać je jako nazwą własną. Równie dobrze można by było liczbę PI zrobić jako podstawę i nazwać to jakoś :) |
|
Gibas11 |
» 2016-11-16 17:51:12 @UP Notacja π-nżynierska? :D //edit: O takie coś Ci chodziło? Nie siedzę w C, więc to C++, ale przepisanie tego nie powinno być straszne. #include <iostream> #include <string>
std::string someUselessNotation( double number ) { double base = number; int index = 0; while( base > 1000.0 ) { base /= 1000; index += 3; } if( index == 0 ) { while( base < 1.0 ) { base *= 1000; index -= 3; } } auto baseString = std::to_string( base ); auto indexString = std::to_string( index ); baseString.erase( baseString.find_last_not_of( '0' ) + 1, std::string::npos ); if( baseString.back() == '.' ) baseString.pop_back(); if( index == 0 ) return baseString; else return baseString + "e" + indexString; }
int main() { while( true ) { double i = 0; std::cin >> i; std::cout << someUselessNotation( i ) << std::endl; } return 0; }
//edit: W sumie nie wiem dlaczego pomyślałem, że w notacji inżynierskiej normalizuje się jakieś liczby do przedziału [0, 1], w każdym razie trochę to poprawiłem. ;-; |
|
Rashmistrz |
» 2016-11-16 17:54:31 Grunt to wymyślać głupie wartości i nazywać je jako nazwą własną. Równie dobrze można by było liczbę PI zrobić jako podstawę i nazwać to jakoś :) |
1. Nikt nie zabrania "twórczości". 2. Możesz nazwać swoje "twory" jak chcesz. 3. Czy ich się nazwa przyjmie i będzie powszechnie używana to nie moja sprawa. 5. Opisywany przez autora zapis istnieje i jest w użyciu. 6. To wciąż będzie modyfikacja lub inna wersja notacji naukowej. 7. Dokładnie... |
|
« 1 » 2 |