C Float с базовым целочисленным значением, дающим разные результаты. - PullRequest
0 голосов
/ 04 декабря 2018

Хорошо, у меня простой вопрос.В своем приключении я ищу самые большие числа, которые могут быть в типах данных, и я пробовал такие вещи, как long int, double, float и т. Д.

Но в простейших присвоениях, таких как Float x = 12345789, это дает мне 123456792 каквыход.Вот код

#include <stdio.h>


int main()
{
 int x = 1234567891 ;
long int y = 9034567891234567899;
long long int  z = 9034567891234567891;
float t = 123456789 ;
printf("%i \n%li \n%lli \n%f \n ",x,y,z,t);
}

, и я получаю вывод:

1234567891
9034567891234567899
9034567891234567891
123456792.000000

Я кодирую на Linux и использую gcc.В чем может быть проблема?

Для ясности, если вы дадите большее число, например

float t = 123456789123456789

, оно получит правильные первые 9, но в некотором смысле округление в последних числах, где это не должно быть.

1234567890519087104.000000

Я мог бы понять это, если бы я работал за 0, как 0,00123, но это просто целые числа, просто чтобы узнать пределы с плавающей точкой.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Чтобы найти наибольшее непрерывное целочисленное значение, которое можно округлить от целого числа до значения с плавающей точкой, можно использовать следующий эксперимент:

#include <stdio.h>

int main()
{
    long i = 0 ;
    float fint = 0 ;

    while( i == (long)fint )
    {
        i++ ;
        fint = (float)i ;
    }

    printf( "Largest integer representable exactly by float = %ld\n", i - 1 ) ;

    return 0;
}

Однако эксперимент в значительной степени не нужен, поскольку значениекак и ожидалось, 2 24 , поскольку 23 - это число бит в плавающей мантиссе.

0 голосов
/ 05 декабря 2018
  • Как визуальный и опытный ученик, я бы порекомендовал вам хорошенько взглянуть на то, как число с плавающей запятой представляется в мире битов, с небольшой помощью некоторого онлайн-конвертера, такого как https://www.h-schmidt.net/FloatConverter/IEEE754.html

    Value:                          123456789
    Hexadecimal representation:     0x4ceb79a3
    Binary representation:          01001100111010110111100110100011
                                    sign    (0)                      : +1
                                    exponent(10011001)               : 2^26
                                    mantissa(11010110111100110100011): 1.8396495580673218
    Value actually stored in float: 1.8396495580673218 * 2^26 = 123456792
    Error due to conversion:        3 

float_converter_image

  • Подробнее о том, как работает компиляторна самом деле делает свою работу: https://gcc.godbolt.org/z/C4YyKe

int main()
{
    float t = 123456789;
}

main:
        push    rbp
        mov     rbp, rsp
        movss   xmm0, DWORD PTR .LC0[rip]
        movss   DWORD PTR [rbp-4], xmm0
        mov     eax, 0
        pop     rbp
        ret
.LC0:
        .long   1290500515     //(0x4CEB79A3)

compiler_explorer_image

  • Для вашего приключения, ищущего наибольшее количество каждого типа данных, я думаюВы можете исследовать стандартные заголовочные файлы, такие как float.h и limits.h.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...