• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Несколько несложных вопросов по C++

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

Несколько несложных вопросов по C++
Есть такой код:
// Задание 1 для float
const float af = 1000,
const float bf = 0.0001;

float cf = af+bf;
float df = pow(cf, 2);
float ef = pow(af, 2);
float ff = 2*af*bf;
float gf = pow(bf, 2);

float hf = df-(ef+ff); //cout << hf << endl;

float resultf = hf/gf;
cout << "Result (float) " << resultf << endl;

// Задание 1 для double
const double ad = 1000,
const double bd = 0.0001;

double cd = ad+bd;
double dd = pow(cd, 2);
double ed = pow(ad, 2);
double fd = 2*ad*bd;
double gd = pow(bd, 2);

double hd = dd-(ed+fd); //cout << hd << endl;

double resultd = hd/gd;
cout << "Result (double) " << resultd << endl;
Как объяснить почему для float и double получаются разные результаты при вычислении одного и того же выражения?

Как вывести на экран resultf в форме без "e" (т. е. в номальной десятичной 2.0003)?

В теле цикла есть такая строка
cout << "X=" << x << " SN=" << sn << " SE=" << se << " Y=" << pow(3, x) << endl;
Как сделать чтобы столбики были ровными?
 
G

Guest

mmiichae
Как объяснить почему для float и double получаются разные результаты при вычислении одного и того же выражения?
Объяснение лежит в стандартах IEEE, с которыми видимо Вы не очень знакомы :(
Вот выдержка из MSDN:
Floating-point numbers use the IEEE (Institute of Electrical and Electronics Engineers) format. Single-precision values with float type have 4 bytes, consisting of a sign bit, an 8-bit excess-127 binary exponent, and a 23-bit mantissa. The mantissa represents a number between 1.0 and 2.0. Since the high-order bit of the mantissa is always 1, it is not stored in the number. This representation gives a range of approximately 3.4E–38 to 3.4E+38 for type float.
Double precision values with double type have 8 bytes. The format is similar to the float format except that it has an 11-bit excess-1023 exponent and a 52-bit mantissa, plus the implied high-order 1 bit. This format gives a range of approximately 1.7E–308 to 1.7E+308 for type double.
Table 3.4 shows the number of bits allocated to the mantissa and the exponent for each floating-point type. The most significant bit of any float or double is always the sign bit. If it is 1, the number is considered negative; otherwise, it is considered a positive number.

Table 3.4 Lengths of Exponents and Mantissas
Type[tab]Exponent length[tab]Mantissa length
float[tab]8 bits[tab]23 bits
[tr]double[tab]11 bits[tab]52 bits
[tr]

Because exponents are stored in an unsigned form, the exponent is biased by half its possible value. For type float, the bias is 127; for type double, it is 1023. You can compute the actual exponent value by subtracting the bias value from the exponent value.
Вот... В Вашем примере происходит банальное переполнение мантиссы у float. Однако не трудно произвести то же самое и для double:
// Задание 1 для double
const double ad = 10000,
const double bd = 0.00001;

double cd = ad+bd;
double dd = pow(cd, 2);
double ed = pow(ad, 2);
double fd = 2*ad*bd;
double gd = pow(bd, 2);

double hd = dd-(ed+fd); //cout << hd << endl;

double resultd = hd/gd;
std::cout << "Result (double) " << resultd << std::endl;
Вместо ожидаемой 1 получаем чудеса! А казалось бы, просто изменили степень на порядок в большую/меньшую сторону.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!