Тип double в C или я схожу с ума :(

Тема в разделе "WASM.ZEN", создана пользователем volodya, 14 авг 2004.

  1. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Пишу:



    double qqq = 0.5;

    double ggg = 1/2;



    В первом случае отладчик показывает 0.5, во втором - НОЛЬ. Кто-то не дружит с головой :dntknw:

    Пишу:



    double ggg = 1000*(1-1/2);



    Полагаю, в ggg должно быть 500, а там по-прежнему 1000! Да что же это такое????
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    volodya

    Просто деление там целочисленное, допиши после 1 или 2 точку и все будет нормально.
     
  3. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    все правильно. Напиши например

    double ggg = 1/2.0;

    или

    double ggg = 1.0/2;

    Проблема из-за приведения типов. 1 - тип int, 2 - тоже тип int, результат целочисленного деления 1 на 2 = 0 и 0 уже приводится к double.

    По поводу второго примера - опять-же сделай одно из чисел double добавив ".0" или просто "." после числа.
     
  4. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    А-а-а!!!

    Спасибо!!!

    Вы правы! :)))
     
  5. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Можно еще приведение типов сделать:
    double ggg = (double)(1/2);
    хотя мне больше нравится
    double ggg((double)(1/2)); - по-моему красиво и необычно :)
     
  6. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    n0p

    Ну и толку от того, что ноль будет приведен к double? 8)
     
  7. DaemoniacaL

    DaemoniacaL New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2003
    Сообщения:
    42
    Адрес:
    Russia
    Я в свое время тоже долго над этим голову ломал :)) с тех пор всегда или тип явно привожу при вычислениях с плавающей точкой, а если константа - то обязательно с точкой и 0
     
  8. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Black_mirror
    Разве ноль? Хмм.. Не помню точно как писать, а с++ под рукой нет.. Ну ход мыслей то верен! :)
     
  9. SI_16

    SI_16 New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    10
    n0p

    правильно, видимо так

    double ggg = ((double)1)/2;
     
  10. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Получается, паскаль лучше в этом случае:



    var

    d: double;

    begin



    d:=1 div 2; { Получается 0.0 }

    d:=0.5; { Получается 0.5 }

    d:=1/2; { Получается 0.5 - верно, на мой взгляд }



    Т.е. есть целочисленное деление, а есть - вещественное. СИ более высокоуровневый в смысле деления ? :)
     
  11. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Нет, просто в сях много дефолтов. Например, если он видит цифру, то считает ее интом, если он видит цифру с точкой, то считает ее даблом. Так как я пользуюсь обычно байтом и флоатом, то постоянно приходится делать приведение типов для констант. Но я привык. :)
     
  12. DaemoniacaL

    DaemoniacaL New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2003
    Сообщения:
    42
    Адрес:
    Russia
    n0p

    Не только в дефолтах но и в порядке выполнения операций. Вот еще одни "грабли" которые долго искал:


    Код (Text):
    1.  
    2. *pointer_to_some_int_array[i] = SOME_INT_CONST;
    3.  




    Как вы думаете куда запишется SOME_INT_CONST?
     
  13. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Тю. А ты в ассемблерный листинг смотри :) И сразу все понятно становится :)
     
  14. DaemoniacaL

    DaemoniacaL New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2003
    Сообщения:
    42
    Адрес:
    Russia
    volodya

    А если нет дизассемблера для данного типа процессора и платформы? а только С компилятор??? :))) Даже отладчик не работал по техническим причинам, а есть только жалкое логирование и снятие логов через интерфейс.... 3 дня искали методом исключения где память всего устройства портится... А процедура компиляции + прошивка + вызов процедуры со снятием лога занимает около часа? :)))
     
  15. Inked Wedge

    Inked Wedge New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2004
    Сообщения:
    33
    Адрес:
    Ukraine
    DaemoniacaL



    по моему это путь к #GP...



    но я не совсем понял, pointer_to_some_int_array это -

    int any[some_elements];

    int** pointer_to_some_int_array = &any; // так?



    если такъ, то открываем Стива Прату и смотрим в приложении таблицу ассоциативности (вроде так...) операций, исходя из которой следует писать



    (*pointer_to_some_int_array) = SOME_INT_CONST;



    если я ничего не напутал, то тут ассоциативность справа налево.....



    а то *pointer_to_some_int_array = SOME_INT_CONST;



    компилер может понять как *(*(pointer_to some_int_array+i)) // если я опять не напутал...
     
  16. Artem

    Artem New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2003
    Сообщения:
    29
    Адрес:
    Russia
    Inked Wedge



    Операция [] находится в первой приоритетной группе, а * - во второй, так что справа налево или слева направо - без разницы.





    Да, и не может понять, а поймёт обязательно :)



    Здесь вобщем-то приоритет достаточно естественный. А вот, скажем, в выражении --*p++ уже всё не так очевидно (декремент содержимого по указателю, после чего инкремент самого указателя).
     
  17. Inked Wedge

    Inked Wedge New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2004
    Сообщения:
    33
    Адрес:
    Ukraine
    Artem



    ага, исходя из чего делаем выводы - если уж дернул черт использовать HLL, то лучше лишний раз все конкретизировать, чем пытацца запомнить все эти подводные камни (это возможно только при довольно длительной практике)...
     
  18. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    что надо расставлять скобки если сомневаешься.
     
  19. DaemoniacaL

    DaemoniacaL New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2003
    Сообщения:
    42
    Адрес:
    Russia
    Inked Wedge

    Именно так и происходило :))) panic - как это принято в нашей терминологии :)
     
  20. Inked Wedge

    Inked Wedge New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2004
    Сообщения:
    33
    Адрес:
    Ukraine
    infern0

    говоря "конкретизировать" я имел в виду именно скобки :/, а может ты знаешь другой путь конкретизации выражений в HLL? тогда плз. по подробней ;)



    DaemoniacaL

    в "вашей" это в чьей?