|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 14, 2004 00:59:03 Пишу: double qqq = 0.5; double ggg = 1/2; В первом случае отладчик показывает 0.5, во втором - НОЛЬ. Кто-то не дружит с головой :( Пишу: double ggg = 1000*(1-1/2); Полагаю, в ggg должно быть 500, а там по-прежнему 1000! Да что же это такое???? |
|
|
Дата: Авг 14, 2004 01:04:24 volodya Просто деление там целочисленное, допиши после 1 или 2 точку и все будет нормально. |
|
|
Дата: Авг 14, 2004 01:06:00 все правильно. Напиши например double ggg = 1/2.0; или double ggg = 1.0/2; Проблема из-за приведения типов. 1 - тип int, 2 - тоже тип int, результат целочисленного деления 1 на 2 = 0 и 0 уже приводится к double. По поводу второго примера - опять-же сделай одно из чисел double добавив ".0" или просто "." после числа. |
|
|
Дата: Авг 14, 2004 01:09:15 А-а-а!!! Спасибо!!! Вы правы! :))) |
|
|
Дата: Авг 14, 2004 14:02:32 Можно еще приведение типов сделать: double ggg = (double)(1/2); хотя мне больше нравится double ggg((double)(1/2)); - по-моему красиво и необычно :) |
|
|
Дата: Авг 14, 2004 14:05:38 n0p Ну и толку от того, что ноль будет приведен к double? 8) |
|
|
Дата: Авг 14, 2004 15:55:35 Я в свое время тоже долго над этим голову ломал :)) с тех пор всегда или тип явно привожу при вычислениях с плавающей точкой, а если константа - то обязательно с точкой и 0 |
|
|
Дата: Авг 14, 2004 23:42:24 Black_mirror Разве ноль? Хмм.. Не помню точно как писать, а с++ под рукой нет.. Ну ход мыслей то верен! :) |
|
|
Дата: Авг 14, 2004 23:57:35 n0p правильно, видимо так double ggg = ((double)1)/2; |
|
|
Дата: Авг 15, 2004 00:57:52 Получается, паскаль лучше в этом случае: var d: double; begin d:=1 div 2; { Получается 0.0 } d:=0.5; { Получается 0.5 } d:=1/2; { Получается 0.5 - верно, на мой взгляд } Т.е. есть целочисленное деление, а есть - вещественное. СИ более высокоуровневый в смысле деления ? :) |
|
|
Дата: Авг 15, 2004 09:06:33 Нет, просто в сях много дефолтов. Например, если он видит цифру, то считает ее интом, если он видит цифру с точкой, то считает ее даблом. Так как я пользуюсь обычно байтом и флоатом, то постоянно приходится делать приведение типов для констант. Но я привык. :) |
|
|
Дата: Авг 15, 2004 16:20:25 n0p Не только в дефолтах но и в порядке выполнения операций. Вот еще одни "грабли" которые долго искал: *pointer_to_some_int_array[i] = SOME_INT_CONST; Как вы думаете куда запишется SOME_INT_CONST? |
|
|
Дата: Авг 15, 2004 22:29:30 Тю. А ты в ассемблерный листинг смотри :) И сразу все понятно становится :) |
|
|
Дата: Авг 16, 2004 00:52:16 volodya А если нет дизассемблера для данного типа процессора и платформы? а только С компилятор??? :))) Даже отладчик не работал по техническим причинам, а есть только жалкое логирование и снятие логов через интерфейс.... 3 дня искали методом исключения где память всего устройства портится... А процедура компиляции + прошивка + вызов процедуры со снятием лога занимает около часа? :))) |
|
|
Дата: Авг 17, 2004 11:01:18 DaemoniacaL по моему это путь к #GP... но я не совсем понял, pointer_to_some_int_array это - int any[some_elements]; int** pointer_to_some_int_array = &any; // так? если такъ, то открываем Стива Прату и смотрим в приложении таблицу ассоциативности (вроде так...) операций, исходя из которой следует писать (*pointer_to_some_int_array)[i] = SOME_INT_CONST; если я ничего не напутал, то тут ассоциативность справа налево..... а то *pointer_to_some_int_array[i] = SOME_INT_CONST; компилер может понять как *(*(pointer_to some_int_array+i)) // если я опять не напутал... |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 1.200 |