float x = 1/4;
![](http://mediasubs.ru/author/avatar/8165744.png)
#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 так не понимает?
За последние 60 дней ни разу не выходила
Сайт листа:
http://www.linuxrsp.ru
Открыт:
25-07-2003
Пре-модерация: Нет
Адрес для писем в лист: comp.soft.linux.discuss-list@subscribe.ru
Адрес
модератора: comp.soft.linux.discuss-owner@subscribe.ru
#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 так не понимает?
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
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
Здравствуйте, Алексеев.
Вы писали 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
В сообщении от 8 марта 2006 20:30 Алексеев Алексей
написал(a):
Более того, тип float используется только для хранения
данных в переменных, а вся плавающая арифметика работает с
double (и литералы тоже)
On Thu, 9 Mar 2006 12:10:27 +0300
"Sergey B. Khvatov" <xbat***@t*****.ru> wrote:
Смелое утверждение. Полагаю, оно будет верным не для всех архитектур.
В сообщении от 10 марта 2006 18:42 Алексеев Алексей
написал(a):
С обратным не сталкивался, хотя работал и работаю не только
с intel-ями. Даже в компиляторе (не gcc) для какой-то
toshiba без fpu этот режим надо было специально включать
через опции компиляции или #pragma
Это поведение было декларировано ещё K&R, но какой у него
сейчас статус я не знаю.
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); (за
синтаксис не ручаюсь)