Considere o código a seguir:
#include <iostream>
#include <cmath>
using namespace std;
class Esfera {
public:
float raio;
float calcularVolume() {
return (4.0/3.0) * M_PI * pow(raio, 3);
}
};
int main() {
Esfera e;
e.raio = 3;
cout << e.calcularVolume() << endl;
}
O que este programa imprime?
#include <iostream>
#include <cmath>
using namespace std;
class Esfera {
public:
float raio;
float calcularVolume() {
return (4.0/3.0) * M_PI * pow(raio, 3);
}
};
int main() {
Esfera e;
e.raio = 3;
cout << e.calcularVolume() << endl;
}
Passo 1
O programa define uma classe chamada Esfera com um atributo público
do tipo
e um método
que retorna o resultado de
No
é criado um objeto
da classe Esfera, atribui-se
e imprime-se o resultado de
com
Informações relevantes dadas pelo código:
- o raio usado é
; - o cálculo usa
para (macro fornecida por muitas implementações de ); - a função retorna
(mas as operações com constantes de ponto flutuante e usualmente usam dupla precisão internamente); - a saída é feita com
no formato padrão (precisão padrão de fluxo é 6 algarismos significativos).
Passo 2
A fórmula matemática que corresponde ao que o programa calcula é o volume de uma esfera:
Aqui:
-
é o volume da esfera; -
é a constante matemática pi (aproximadamente ); -
é o raio da esfera.
No código, essa fórmula aparece exatamente como. A função calcula .
Passo 3
Substituímos
na fórmula e simplificamos passo a passo:
Primeiro calcule :
Primeiro calcule
Agora multiplica-se por
:
Portanto a expressão inteira fica
Passo 4
Agora avaliamos numericamente usando o valor de
. Se usarmos a aproximação usual de
fornecida por
(aproximadamente
), temos
Passo 5
Detalhes práticos sobre o que é realmente impresso:
- a função membro retorna
, então o valor será convertido para precisão de ponto flutuante simples antes de ser enviado ao fluxo; - o
em C++ usa por padrão precisão (seis algarismos significativos) no formato geral, então o número impresso será arredondado para algarismos significativos.
O valor numérico calculado é, que com algarismos significativos fica escrito como
(no separador decimal em português usei vírgula).
Passo 6
Observação final de robustez: estou assumindo que
está disponível no ambiente (gcc/clang definem-no por compatibilidade). Se uma implementação não definir
, o código nem compilaria; mas o enunciado pediu para assumir o código apresentado, então consideramos
válido.