· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› Тип double в C или я схожу с ума :(

. 1 . 2 . >>

Посл.отвђт Сообщен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)) // если я опять не напутал...

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 1.200