Отправляет email-рассылки с помощью сервиса Sendsay

float x = 1/4;

#include <stdio.h>

int main(void)
{
float x;
x = 1/4;
printf("\n x = %g\n",x);

return 0;
}

$gcc -o pricol pricol.c

$./pricol

x = 0

Так делать нельзя? Или gcc так не понимает?

Ответить   (#523646)

 

Ответы:

On Sun, 5 Mar 2006 17:30:05 +0200
Max <max.subscri***@m*****.ru> wrote:

Не возьмусь утверждать, что и в C так же, но в свое время (когда я
учился программированию) нас ориентировали на то, чтобы аккуратно
работать с типами данных. Что у Вас получается:

float x;
x = 1/4;

1 - тип данных integer
4 - тип данных integer

1/4 воспримется как целочисленная операция (integer). Т. е. результат
будет равным нулю.

Т. е. чтобы избежать этого, Вам надо, чтобы операция воспринималась как
плавающая точка. Для этого хотя бы один операнд д. б. float.

Что-то вроде x = 1./4;

Это то, что сразу приходит в голову. Вот почему Вирт утверждал, что
сильная типизация в языках лучше. Например в MODULA-2 эта конструкция
сразу выдала бы синтаксическую ошибку. И уже на этапе компиляции с Вас
бы потребовалось или x = 1./4.; или x = float(1)/float(4); (за
синтаксис не ручаюсь)

05.03.06, Max<max.subscri***@m*****.ru> написал:

C учить пробовали? ;)
Писать надо x = 1.0/4.0; иначе все округлится до целого.

Еще можно просто x = (float)1/4;
Достаточно, чтобы только один из операндов был действительным. Так универсальнее,
с точки зрения применения переменных.

ЗЫ Сори за порванный тред. Мейл.ру аднака.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 25243; Возраст листа: 955; Участников: 1468
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/523698

Ответить   Oleg Matviychuk (#523698)

 

On Mon, Mar 06, 2006 at 12:21 +0300, Matvey wrote:

Вот учу.

Спасибо ВСЕМ за разъяснения.

Здравствуйте, Max.

Вы писали 5 марта 2006 г., 18:30:05:

Результат действия подводится под самый широкий из типов аргументов.
Т.е. 1/4: 1 - целый тип, 4 - тоже. Результат округляется до целого
типа (до 0), и только потом преобразуется в float, после чего x
присваивается соответствующее значение. Надо:
x=1./4
Или лучше x=float(1)/float(4). Кстати, некоторые компиляторы сообщают
о таком несоответствии типов.

On Mon, 6 Mar 2006 12:45:32 +0300
Дектярёв Михаил <drakon-mvd@y*****.ru> wrote:

Кстати, тип литералы с плавающей точкой можно указывать и при помощи
суффикса. В частности 1.0f - означает, что 1.0 является типа float.

--
С уважением,
Алексеев А. Н.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 25301; Возраст листа: 957; Участников: 1465
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/524374

Ответить   Алексеев Алексей (#524374)

 

Здравствуйте, Алексеев.

Вы писали 7 марта 2006 г., 20:07:18:

А в чём разница между 1.0 и 1.0f ? Дробные числа вроде по умолчанию
тип float, а не double.

On Wed, 8 Mar 2006 19:55:01 +0300
Дектярёв Михаил Владимирович <drakon-mvd@y*****.ru> wrote:

Напротив, по умолчанию число с плавающей точкой является типа double.
А если требуется вещественное числа типа long double, то указывается
суффикс l: 1.0l.

--
С уважением,
Алексеев А. Н.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 25312; Возраст листа: 957; Участников: 1468
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/524673

Ответить   Алексеев Алексей (#524673)

 

В сообщении от 8 марта 2006 20:30 Алексеев Алексей
написал(a):

Более того, тип float используется только для хранения
данных в переменных, а вся плавающая арифметика работает с
double (и литералы тоже)

Ответить   "Sergey B. Khvatov" (#524852)

 

On Thu, 9 Mar 2006 12:10:27 +0300
"Sergey B. Khvatov" <xbat***@t*****.ru> wrote:

Смелое утверждение. Полагаю, оно будет верным не для всех архитектур.

Ответить   Алексеев Алексей (#525513)

 

В сообщении от 10 марта 2006 18:42 Алексеев Алексей
написал(a):

С обратным не сталкивался, хотя работал и работаю не только
с intel-ями. Даже в компиляторе (не gcc) для какой-то
toshiba без fpu этот режим надо было специально включать
через опции компиляции или #pragma

Это поведение было декларировано ещё K&R, но какой у него
сейчас статус я не знаю.

Ответить   "Sergey B. Khvatov" (#526313)