Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
calypso
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
1

Как разделить целое число Int64 на целое 1024 и получить double с 2 знаками после запятой

11.10.2012, 17:48. Просмотров 3465. Ответов 25
Метки нет (Все метки)

C++
1
2
3
Int64 chislo=1234567890;
double chislo2=chislo/1024;
label1->Text=Convert::ToString(Math::Round(chislo2,2))
chislo2 всегда целое,дробная часть отсутствует
если ввести chislo2=123456.789123 то округляется до 2 знаков
Т.е. не работает именно деление,оно всегда дает целый результат
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2012, 17:48
Ответы с готовыми решениями:

Скрипт в результате выдает число целое, а надо с двумя знаками после запятой
Добрый день. Скрипт в результате выдает число целое, надо с двумя знаками после запятой, так как...

Как разделить переменую типа double на целое и дробное число ?
Как разделить переменую типа double на целое и дробное число ? Добавлено через 23 минуты Нашол...

Каким образом число с плавающей запятой разделить на целое?
Не могу разобраться, как мне число с плавающей запятой, которое записано в строковую переменную....

Дано трехзначное целое число А. Получить из него двузначное целое число путем отбрасывания первой цифры
Дано трехзначное целое число А. Получить из него двузначное целое число путем отбрасывания первой...

Дано целое число m>1. Получить наибольшее целое k, при котором k3<m
Дано целое число m&gt;1. Получить наибольшее целое k, при котором {k}^{3}&lt;m

25
ValeryS
Модератор
7743 / 5751 / 748
Регистрация: 14.02.2011
Сообщений: 19,698
Завершенные тесты: 1
11.10.2012, 19:46 2
Цитата Сообщение от calypso Посмотреть сообщение
double chislo2=chislo/1024;
у тебя происходит целочисленное деление и только потом результат приравнивается к double
или так
C++
1
double chislo2=chislo/1024.0;
или так
C++
1
double chislo2=(double)(chislo)/1024;
0
calypso
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
11.10.2012, 20:55  [ТС] 3
Ясно,не знал про такую хитрость. Насколько я помню в BorlandC++ "/" используется как обычное деление,не целочисленное.. или нет?

Добавлено через 2 минуты
И ещё вопрос,Math::Round округляет по правилам математики или отрезает знаки лишние?
123.4567 округлит до 123.45 или 123.46 ?
0
ValeryS
Модератор
7743 / 5751 / 748
Регистрация: 14.02.2011
Сообщений: 19,698
Завершенные тесты: 1
11.10.2012, 21:10 4
Цитата Сообщение от calypso Посмотреть сообщение
Насколько я помню в BorlandC++ "/" используется как обычное деление,не целочисленное..
В С если и делимое и делитель целочисленные то и деление целочисленное если хоть один операнд плавающий то и деление плавающее
Цитата Сообщение от calypso Посмотреть сообщение
И ещё вопрос,Math::Round округляет по правилам математики или отрезает знаки лишние
посмотри
http://msdn.microsoft.com/ru-ru/library/75ks3aby.aspx
я обычно делаю вручную
пример
C++
1
2
3
4
double d =123.456789;
double tmp=d*100+0.5;
int tmp1=(int) tmp;
double m=tmp1/100.0;
0
11.10.2012, 21:10
calypso
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
12.10.2012, 20:54  [ТС] 5
Да действительно,и в VC++,и в EmbarcaderoC++ если сделать деление на 1024.0 то получаем вещественное число.Единственное что хотелось отметить,это невозможность округления до 2х знаков при битовом сдвиге. О чем речь:
C++
1
2
3
... //razmer - размер диска в байтах
razmerMB=(razmer>>20);
razmerGB=(razmer>>30);
Приходится делать так:
C++
1
2
razmerMB=Math::Round((razmer/1024.0/1024.0),2)
razmerGB=Math::Round((razmer/1024.0/1024.0/1024.0),2)
0
ValeryS
Модератор
7743 / 5751 / 748
Регистрация: 14.02.2011
Сообщений: 19,698
Завершенные тесты: 1
12.10.2012, 21:59 6
Цитата Сообщение от calypso Посмотреть сообщение
.Единственное что хотелось отметить,это невозможность округления до 2х знаков при битовом сдвиге.
сдвиг относится к целочисленным переменный там о дробной части и не слыхали
можно попробовать на ассемблере
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned int n;
_asm
  {
     xor EBX,EBX;
     mov EAX,razmer;
     mov ECX,10; // сдвиг на 10 хочешь поставь 20 30
 metka:
     CLC;// очистить бит переноса 
     RCR  EAX,1;
     RCR  EBX,1;
loop metka ;
     mov n,ebx;
 }
в n двоичное представление остатка но переводить на человеческий язык должен сам
0
castaway
Эксперт С++
4940 / 3045 / 455
Регистрация: 10.11.2010
Сообщений: 11,139
Записей в блоге: 10
Завершенные тесты: 1
13.10.2012, 00:33 7
Цитата Сообщение от ValeryS Посмотреть сообщение
можно попробовать на ассемблере
А почему нельзя попробовать на Си?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main()
{
    int quotient, remainder, value = 1026;
 
    remainder = value & ~1024;
    quotient = value >> 10;
 
    printf( "i = %d\nr = %d\n", quotient, remainder );
 
    return 0;
}
0
ValeryS
Модератор
7743 / 5751 / 748
Регистрация: 14.02.2011
Сообщений: 19,698
Завершенные тесты: 1
13.10.2012, 00:57 8
Цитата Сообщение от lazybiz Посмотреть сообщение
А почему нельзя попробовать на Си?
можно че нельзя то
просто человек чисто сдвигами хотел
а C не поддерживает циклических сдвигов да и через перенос не работает

Добавлено через 3 минуты
Цитата Сообщение от lazybiz Посмотреть сообщение
remainder = value & ~1024;
а вот так нельзя
1024=0х400
~1024= 0xFFFFFBFF
а нужно 0x3FF
лучше так
C++
1
remainder = value & (1024-1);
да и вывод надо переделывать чтоб правильно дроби казал
1
calypso
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
13.10.2012, 18:40  [ТС] 9
Я хотел как проще. Получается что проще 3 раза делить на 1024.0 чем писать отдельную подпрограмму сдвига с дробями
0
ValeryS
Модератор
7743 / 5751 / 748
Регистрация: 14.02.2011
Сообщений: 19,698
Завершенные тесты: 1
13.10.2012, 18:46 10
Цитата Сообщение от calypso Посмотреть сообщение
Получается что проще 3 раза делить на 1024.0
а сразу делить на 1048576.0 для мегабайт и 1073741824.0 для гигабайт
Цитата Сообщение от calypso Посмотреть сообщение
Я хотел как проще.
делить действительно проще делением для double занимается сопроцессор и делает это очень быстро
0
castaway
Эксперт С++
4940 / 3045 / 455
Регистрация: 10.11.2010
Сообщений: 11,139
Записей в блоге: 10
Завершенные тесты: 1
13.10.2012, 19:00 11
Цитата Сообщение от ValeryS Посмотреть сообщение
делением для double занимается сопроцессор и делает это очень быстро
Но не быстрее чем сдвиг.
0
ValeryS
Модератор
7743 / 5751 / 748
Регистрация: 14.02.2011
Сообщений: 19,698
Завершенные тесты: 1
13.10.2012, 19:02 12
Цитата Сообщение от lazybiz Посмотреть сообщение
Но не быстрее чем сдвиг.
какой сдвиг в дубле?
0
castaway
Эксперт С++
4940 / 3045 / 455
Регистрация: 10.11.2010
Сообщений: 11,139
Записей в блоге: 10
Завершенные тесты: 1
13.10.2012, 19:05 13
А при чем тут double если делить надо int64 ?
0
ValeryS
Модератор
7743 / 5751 / 748
Регистрация: 14.02.2011
Сообщений: 19,698
Завершенные тесты: 1
13.10.2012, 19:12 14
Цитата Сообщение от lazybiz Посмотреть сообщение
А при чем тут double если делить надо int64 ?
название темы читаем
Цитата Сообщение от calypso Посмотреть сообщение
Как разделить целое число Int64 на целое 1024 и получить double с 2 знаками после запятой
как ты сдвигом получишь дробь?

Добавлено через 3 минуты
и насчет скорости я бы не стал так безапелляционно заявлять
деление в сопре может занимать один такт,так же как и сдвиг (причем делает это параллельно)
накладные расходы закинуть в сопр и вытащить
0
castaway
Эксперт С++
4940 / 3045 / 455
Регистрация: 10.11.2010
Сообщений: 11,139
Записей в блоге: 10
Завершенные тесты: 1
13.10.2012, 19:17 15
Ах да, забыл. Ну тогда можно через умножение. Оно тоже быстрее деления.
C
1
result = value64 * .0009765625;
Мне трудно понять сленговые слова вроде "сопра" и "дубля". Говори понятным языком.
0
ValeryS
Модератор
7743 / 5751 / 748
Регистрация: 14.02.2011
Сообщений: 19,698
Завершенные тесты: 1
13.10.2012, 19:29 16
Цитата Сообщение от lazybiz Посмотреть сообщение
"сопра" и "дубля". Говори понятным языком.
сопр- арифметический сопроцессор встроен в процессор начиная с 486DX
дубль,дубля калька с английского double

Добавлено через 3 минуты
Цитата Сообщение от lazybiz Посмотреть сообщение
value64 * .0009765625;
умножаем на .0009765625 т.е double
опять включается сопроцессор а для него и деление и умножение одинаковой сложности
не путай с процессором где деление занимает до 36 тактов
0
castaway
Эксперт С++
4940 / 3045 / 455
Регистрация: 10.11.2010
Сообщений: 11,139
Записей в блоге: 10
Завершенные тесты: 1
13.10.2012, 19:30 17
Цитата Сообщение от ValeryS Посмотреть сообщение
деление в сопре может занимать один такт
А может и не занимать. Зависит от процессора.
0
ValeryS
Модератор
7743 / 5751 / 748
Регистрация: 14.02.2011
Сообщений: 19,698
Завершенные тесты: 1
13.10.2012, 19:34 18
Цитата Сообщение от lazybiz Посмотреть сообщение
Зависит от процессора.
еще раз сопроцессора! он специально заточен под математические операции
Я сейчас не могу найти книгу с растактовкой, но можешь поверить на слово деление там намного быстрее чем в процессоре
0
calypso
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
13.10.2012, 19:42  [ТС] 19
а сразу делить на 1048576.0 для мегабайт и 1073741824.0 для гигабайт
У меня алгоритм просто такой: получаем размер диска и свободного, 2 раза делим на 1024.0 - если число больше 10000 значит делим ещё раз на 1024.0 и размер выводим в ГБ,иначе в МБ
Например, диск С: Размер 125,67 ГБ ,свободное место 2437,34 МБ
диск D: Размер 35,67 ГБ ,свободное место 13,45 ГБ

Добавлено через 2 минуты
Для современных процессоров вы не заметите разницу в скорости, FPU или CPU делит.
Мы же детскими тривиальными задачами занимаемся,а не рассчитываем скорость сферического коня в вакуумной космической эллипсойдной галактике)
0
castaway
Эксперт С++
4940 / 3045 / 455
Регистрация: 10.11.2010
Сообщений: 11,139
Записей в блоге: 10
Завершенные тесты: 1
13.10.2012, 19:42 20
Что-то не хочется мне верить тебе на слово ...

К примеру. Процессор Pentium. Числа - clock cycles, np - not pairable.
DIV r8/m8 17 np
DIV r16/m16 25 np
DIV r32/m32 41 np

FDIV(R)(P) r/m 19/33/39 p) 0 38 o) 2

FIDIV(R) m 22/36/42 p) np 38 o) 2
Источник: http://www.agner.org/optimize/instruction_tables.pdf
1
13.10.2012, 19:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2012, 19:42

Дано целое число m. получить найбольщее целое k при котором 4^k<m
дано целое число m. получить найбольщее целое k при котором 46^k&lt;m Добавлено через 1 минуту...

Дано целое число m>1. Получить наименьшее целое k, при котором 4^k>m. Блок-схема
Дано целое число m&gt;1. Получить наименьшее целое k, при котором 4^k&gt;m.

Дано целое число m. Получить наибольшее целое k, при котором 4^k<m. Использовать цикл с постусловием
Помогите новичку решить задачу по программированию на цикл с постусловием (repeat...until) Дано...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru