Member 12920367 Ответов: 3

Почему эта программа ошибочна ?


когда я сделал эту программу, она показывала 58, когда я компилировал ее, но ее ans был 59 . Его не следует bodmas это?
программа приведена ниже: =

Плас помочь и

Что я уже пробовал:

#include <iostream>

using namespace std;

int main()
{

int x=3;
float y=5.6;
x=x+10*y;
cout<<x;
    return 0;
}

Philippe Mori

Значения с плавающей запятой не являются точными. Таким образом, вы должны правильно округлить их при преобразовании, чтобы избежать того, чтобы что-то вроде 58.9999 было усечено до 58. Насколько мне известно, FPU будет округлять числа, но C/C++ будет их усекать.

3 Ответов

Рейтинг:
1

OriginalGriff

Вероятно, это зависит от компилятора и системы, которую вы используете: когда я пытаюсь это сделать, я получаю 59.
Проблема может возникнуть из-за того, что вы смешиваете типы данных:

x=x+10*y;
  ^  ^ ^
  |  | |
  |  | ---- float
  |  ------ integer
   -------- integer
Когда вы умножаете 10 * y система может сделать это двумя способами: преобразовать целое число 10 в число с плавающей точкой и затем умножить или преобразовать число с плавающей точкой в целое число и затем умножить - и это может привести к различным результатам, если преобразование "5.6" округлено или усечено. Округление даст вам 6, усечение даст вам 5, так что вы можете предположительно получить 50, 56 или 60 в качестве целого результата. Это означает, что вы можете получить конечное значение 53, 59 или 63, но очень маловероятно, что вы получите 58.
Except...it может быть проблема точности: Точность поплавка–от нуля до 100 + цифр | случайный ASCII[^]
Попробуйте сделать все с плавающей точкой:
float x = 3.0;
float y = 5.6;
x = x + 10.0 * y;
cout << x;
И я подозреваю, что ваша проблема просто исчезнет...


CPallini

В выражении вычисление должно происходить следующим образом:
неявное преобразование в float
http://en.cppreference.com/w/c/language/conversion
из всех операндов выполняется. В конце концов результат приводится к int.

Afzaal Ahmad Zeeshan

5ед.

Рейтинг:
0

CPallini

59 это правильный ответ, не так ли?
Это поведение не имеет ничего общего с нарушением бодмаса, оно вытекает из правил округления тела. IEEE754[^], Я верю.


Рейтинг:
0

Patrice T

поплавки не хранят точных значений, это ваша проблема.
Попробуй:

x=round(x+10*y);

С поплавками 5.6 - это что-то вроде 5.599999...
а x+10 * y дает 58,99999... который преобразуется в 58 при хранении в x.
round-C++ Reference[^]


CPallini

В моей системе 5.6 - это 0x40b33333, который проблематично напоминает 5.5999..
Однако 5.6*10 - это 0x42600000, что равно 56 (показатель степени 6, мантисса = 0.111 B)
То есть, согласно правилам IEEE754, результат округляется.

Afzaal Ahmad Zeeshan

5ед.