Получение длины поплавка

Я пытаюсь получить длину числа с плавающей запятой, но он говорит, что длина равна 8. Я хочу знать, сколько цифр. почему он говорит, что есть только 8 цифр?

#include <stdio.h>

int main()
{
    double n = 72382.413651;
    int len;

    len = sizeof(n);
    printf("%d\n", len);
}

Мне нужно знать длину поплавка, потому что это будет полезно при создании таблицы логарифмов, подобной этой.

--------------------------
| 1000000 | 72382.413651 |
--------------------------

person kyle k    schedule 31.08.2013    source источник
comment
Вы имеете в виду значащие цифры? Что вы ожидаете напечатать и почему?   -  person dcaswell    schedule 31.08.2013
comment
Конечно, sizeof(double) даст размер double, который равен 8.   -  person SKPS    schedule 31.08.2013
comment
sizeof сообщает вам, сколько памяти в байтах требуется для числа во внутреннем двоичном представлении. Дело не в количестве цифр. Что касается количества цифр, есть значащие цифры, а также цифры точности. Когда вы сохраняете число 71281.413651, оно может фактически оказаться внутри 71281.41365099999983 в зависимости от того, насколько хорошо оно преобразуется в двоичный код.   -  person lurker    schedule 31.08.2013
comment
Почему люди минусуют это? Это законный вопрос, и он показывает искреннее стремление понять, что происходит.   -  person Sergey Kalinichenko    schedule 31.08.2013
comment
Лично я проголосовал против него, потому что понятия не имею, что он хочет, чтобы программа напечатала, и после того, как его спросили, не ответил.   -  person dcaswell    schedule 31.08.2013
comment
@user814064 user814064 Я добавил, для чего он будет использоваться, для печати правильно отформатированной таблицы.   -  person kyle k    schedule 31.08.2013
comment
Какое отношение 1 миллион имеет к 73 тысячам?   -  person dcaswell    schedule 31.08.2013
comment
@user814064 72382.413651 — натуральный логарифм 1 миллиона.   -  person kyle k    schedule 31.08.2013
comment
Как 1 миллион форматирует 72 тысячи.   -  person dcaswell    schedule 31.08.2013


Ответы (3)


Использование sizeof(n) несколько вводит в заблуждение, потому что значение n не влияет на ответ: вы всегда получаете эквивалент sizeof(double), который на вашем компьютере выглядит как 64 бита или 8 байт. Напомним, что sizeof — это операция времени компиляции; имеет значение только тип параметра, но не его значение.

Количество цифр в представлении числа с плавающей запятой часто является бессмысленным значением, поскольку в целом представление является неточным. Достоверно можно определить только количество цифр перед десятичным разделителем; цифры после разделителя обычно усекаются до числа, которое вы устанавливаете по своему вкусу.

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

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

person Sergey Kalinichenko    schedule 31.08.2013

Если вы ищете подсчет количества цифр в double, вы, вероятно, могли бы использовать sprintf и преобразовать в строку. Затем вы можете подсчитать символы в строке.

Это уже обсуждалось здесь.

person SKPS    schedule 31.08.2013

Переход от dasblinkenlight и Эрика. Пример того, что вы можете сделать, это просто отредактировать свой код, чтобы он выглядел следующим образом:

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

int main()
{
    double n = 72382.413651;
    //int len;

    //len = sizeof(n);
    //printf("%d\n", len);
    printf("%5.6f\n", n);
    getchar();
}

Это напечатает значение, чтобы оно выглядело точно так же, как в объявлении.

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

#include <ansi_c.h>
#include <stdio.h>
#include <stdlib.h>

//varible format codes for varying decimal point positions    
char *format[]={"%0.9f\n",
                    "%0.8f\n",

                "%0.7f\n",
                "%0.6f\n",
                "%0.5f\n",
                "%0.4f\n",
                "%0.3f\n",
                "%0.2f\n",
                "%0.1f\n",
                "%0.0f.\n"};

int main()
{
    char val[25];
    char dp[]={"."};//will search for position of decimal point in string
    //for the purposes of illustration, create some floating point values
    double a = .723824136;
    double s = 7.23824136;
    double d = 72.3824136;
    double f = 723.824136;
    double g = 7238.24136;
    double h = 72382.4136;
    double j = 723824.136;
    double k = 7238241.36;
    double l = 72382413.6;
    double m = 723824136.;

    //put in string of standard length,   
    //format output according to decimal position
    sprintf(val, "%0.12f", a); printf( format[strcspn(val, dp)], a);
    sprintf(val, "%0.12f", s); printf( format[strcspn(val, dp)], s);
    sprintf(val, "%0.12f", d); printf( format[strcspn(val, dp)], d);
    sprintf(val, "%0.12f", f); printf( format[strcspn(val, dp)], f);
    sprintf(val, "%0.12f", g); printf( format[strcspn(val, dp)], g);
    sprintf(val, "%0.12f", h); printf( format[strcspn(val, dp)], h);
    sprintf(val, "%0.12f", j); printf( format[strcspn(val, dp)], j);
    sprintf(val, "%0.12f", k); printf( format[strcspn(val, dp)], k);
    sprintf(val, "%0.12f", l); printf( format[strcspn(val, dp)], l);
    sprintf(val, "%0.12f", m); printf( format[strcspn(val, dp)], m);
    getchar();
}
person ryyker    schedule 31.08.2013