Imposta la precisione dei numeri in virgola mobile in C++

Jinku Hu 12 ottobre 2023
  1. Usa std::setprecision per impostare la precisione dei numeri in virgola mobile in C++
  2. Usa std::floor e std::ceil per modificare la precisione dei numeri in virgola mobile
  3. Usa std::round e std::lround per modificare la precisione dei numeri in virgola mobile
Imposta la precisione dei numeri in virgola mobile in C++

Questo articolo spiegherà diversi metodi su come impostare la precisione dei numeri in virgola mobile in C++.

Usa std::setprecision per impostare la precisione dei numeri in virgola mobile in C++

std::setprecision fa parte della libreria dei manipolatori I/O STL che può essere usata per formattare i flussi di input/output. setprecision cambia la precisione dei numeri in virgola mobile e richiede solo un parametro integrale che specifica le cifre del numero da visualizzare dopo il punto decimale. Vale a dire, la precisione predefinita assunta implicitamente per i numeri in virgola mobile è di sei cifre dopo la virgola. Tuttavia, a volte il float può essere visualizzato dalla notazione scientifica quando il numero è troppo piccolo e non vengono utilizzati manipolatori. Si noti che tali numeri potrebbero perdere tutte le cifre significative e apparire come zeri, come illustrato nel codice di esempio seguente.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::setprecision;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.012,
                          26.9491092019, 113,    0.000000234};

  for (auto &i : d_vec) {
    cout << i << " | ";
  }
  cout << endl;

  for (auto &i : d_vec) {
    cout << setprecision(3) << i << " | ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Produzione:

123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
123.231 | 2.234 | 0.012 | 26.949 | 113.000 | 0.000 |

Usa std::floor e std::ceil per modificare la precisione dei numeri in virgola mobile

Le funzioni std::floor e std::ceil sono fornite dall’intestazione <cmath>, che era originariamente implementata nella libreria standard C. La funzione ceil calcola il valore intero più piccolo maggiore o uguale al virgola mobile passato come unico argomento. D’altra parte, floor calcola il più grande valore intero minore o uguale all’argomento. Queste funzioni sono definite per i tipi float, double e long double.

#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.012,
                          26.9491092019, 113,    0.000000234};

  for (auto &i : d_vec) {
    cout << i << " | ";
  }
  cout << endl;

  for (auto &i : d_vec) {
    cout << fixed << std::ceil(i) << " | ";
  }
  cout << endl;

  for (auto &i : d_vec) {
    cout << fixed << std::floor(i) << " | ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Produzione:

123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
124.000000 | 3.000000 | 1.000000 | 27.000000 | 113.000000 | 1.000000 |
123.000000 | 2.000000 | 0.000000 | 26.000000 | 113.000000 | 0.000000 |

Usa std::round e std::lround per modificare la precisione dei numeri in virgola mobile

In alternativa, std::round e std::round possono essere utilizzati per calcolare i valori interi più vicini che vengono arrotondati dallo zero. È probabile che queste funzioni generino errori relativi all’aritmetica in virgola mobile, discussi in dettaglio nella pagina.

#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.012,
                          26.9491092019, 113,    0.000000234};

  for (auto &i : d_vec) {
    cout << i << " | ";
  }
  cout << endl;

  for (auto &i : d_vec) {
    cout << fixed << std::round(i) << " | ";
  }
  cout << endl;

  for (auto &i : d_vec) {
    cout << fixed << std::lround(i) << " | ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Produzione:

123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
123.000000 | 2.000000 | 0.000000 | 27.000000 | 113.000000 | 0.000000 |
123 | 2 | 0 | 27 | 113 | 0 |
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - C++ Float