Int to float to char[20]

Здравствуйте!Не могу понять почему не выводится число с плавающей точкой   Problem:есть две переменные int a, bи переменная float c;c = (float)(b/2*a);затем c переводится в строкуsprintf(str, "%g", c);например, a = 10 и b = 20 , то ответ должен быть 1, но выводится целое число 72В чем может быть причина?
8 ответов

c = (float)b/2*a;sprintf(str, "%f", c);


например, a = 10 и b = 20 , то ответ должен быть 1, но выводится целое число 72
1?c = (float)(b/2*a) =20/2*10 = 100 


Деран, обрати внимание, что код:
    int a = 10;    int b = 11;    int c0 = (b/2*a);    std::cout << "c0: " << c0 << std::endl;    float c1 = (b/2*a);    std::cout << "c1: " << c1 <<std::endl;    float c2 = (float) (b/2*a);    std::cout << "c2: " << c2 << std::endl;    float c3 = (b / 2.0 * a);    std::cout << "c3: " << c3 << std::endl;
выводит на консоль:
c0: 50c1: 50c2: 50c3: 55    
Добавлено через 10 минут и 39 секундЭтим я хотел сказать, что для того чтобы получить float в результате операции, необходимо чтобы хотябы одно из чисел в операции было вещественным.C sprintf(str, "%g", c); все нормально:
g   -  с плавающей точкой,  значение со знаком либо в форме f, либо в форме e, с данным значением и точностью. Хвостовые нули и десятичная точка печатаются только при необходимости
Можно и так:
    float c4 = (float(b) / 2 * a);    char str[256];    sprintf(str, ", str: %g", c4);    std::cout << "c4: " << c4 << str << std::endl;


Цитата(Деран @  27.7.2008,  09:14 )
например, a = 10 и b = 20 , то ответ должен быть 1, но выводится целое число 72
1?c = (float)(b/2*a) =20/2*10 = 100
Ой! Забыл скобки (2*a)Спасибо всем! Теперь все работает     


Вообще, такой стиль приведения типа к типу не надежный. Это стиль С.В С++ рекомендуют использовать static_cast, dinamic_cast, const_cast, или если очень надо reinterpret_cast.В данном случае лучше static_cast (если я ничего не напутал с просони).


Вообще, такой стиль приведения типа к типу не надежный. Это стиль С.
с встроенными типами надежен, к тому же тут непойми, что у человека. Это скорее С, чем С++, по крайней мере sprintf C-style.
(если я ничего не напутал с просони).
нифига себе утро 


с встроенными типами надежен
Не согласшусь. Если я ничего не путаю, то в случае int a = (int) b;, где b - ******, дробная часть полностью откинется, т.е. т.к. к примеру число 11 может в реале храниться, как 10.9999999 при подобном приведении получим 10, а не 11. Как мне кажется static_cast этот вопрос решает. Или я ошибаюсь?
нифига себе утро smile 
Ну все бывает в этой жизни =) Из-за жары летом на ночной режим работы перехожу... Тишина. Благодать... Прохладно. К утру правда попискивание кузнечиков, хрен знает откуда в Москве взявшихся и крики неудовлетворенных самцов ворон напрягают. А так ниче... Очень даже.. =)Да и потом, бесконечность для нас не предел =)


Или я ошибаюсь?
в любом случае до 10 обрежетДобавлено через 52 секундыstatic_cast это всего лишь другая запись, более наглядная