Рубрики

Операции с плавающей точкой и ассоциативность в C, C ++ и Java

Следуют ли операции с плавающей точкой свойству ассоциативности? Другими словами, мы всегда получаем одинаковые результаты для выражений «(A + B) + C» и «A + (B + C)»

Можно ожидать, что плавающие числа будут следовать правилу ассоциативности в языках программирования, поскольку они математически ассоциативны. Однако это не так во всех случаях.

Рассмотрим ниже программу C / C ++.

// C / C ++ программа для демонстрации этой плавающей запятой
// сложение не может быть ассоциативным.
#include<stdio.h>

int main()

{

    // A и B имеют нормальные значения, но соответствующие знаки

    float A = -500000000;

    float B =  500000000;

  

    float C = 1;

  

    printf("A + (B + C) is equal to %f \n", A + (B + C));

    printf("(A + B) + C is equal to %f", (A + B) + C);

  

    return 0;

}

Выход:

A + (B + C) is equal to 0.000000 
(A + B) + C is equal to 1.000000

Из приведенного выше вывода видно, что арифметика с плавающей запятой может не следовать закону ассоциативности в каждом случае. Это связано с тем, что формат, в котором хранятся и представляются числа с плавающей запятой, округляет числа во время вычислений, следовательно, ассоциативные законы алгебры необязательно выполняются для чисел с плавающей запятой. В таком случае,

Explanation for above output:

A + (B + C):
(B + C) = 500000000.0 + 1.0
        = 500000000.0 
(rounded off during floating point arithmetic)

A + (B + C) = -500000000.0 + 500000000.0 
            =  0.000000

(A + B) + C:
(A + B) = -500000000.0 + 500000000.0 
        = 0.000000

(A + B) + C = 0.000000 + 1 
            = 1.000000

Как насчет Java?
Мы получаем те же результаты в Java, поскольку Java также использует аналогичное представление для чисел с плавающей точкой.

// Java-программа для демонстрации этой плавающей запятой
// сложение не может быть ассоциативным

import java.io.*;

  

class Main

{

    public static void main (String[] args)

    {

        // A и B имеют нормальные значения, но соответствующие знаки

        float A = -500000000;

        float B =  500000000;

  

        float C = 1;

  

        System.out.println("A + (B + C) is equal to "

                          (A + (B + C)));

        System.out.println("(A + B) + C is equal to "

                          ((A + B) + C));

    }

}

Выход:

A + (B + C) is equal to 0.000000 
(A + B) + C is equal to 1.000000

Как насчет целых чисел?
Теперь давайте попробуем те же вычисления, когда тип данных целочисленный. Вот фрагмент кода для вашего наблюдения:

#include<stdio.h>
#include<stdio.h>

int main()

{

   // A и B имеют нормальные значения, но соответствующие знаки

   int A = -500000000;

   int B =  500000000;

  

   int C = 1;

  

   printf(" A + (B + C) is equal to %d \n", A + (B + C));

   printf("(A + B) + C is equal to %d", (A + B) + C);

  

   return 0;

}

Выход:

 A + (B + C) is equal to 1 
(A + B) + C is equal to 1

Эта статья предоставлена Пранджалом Матуром . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Операции с плавающей точкой и ассоциативность в C, C ++ и Java

0.00 (0%) 0 votes