Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/34: Рейтинг темы: голосов - 34, средняя оценка - 4.71
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57

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

11.10.2012, 17:48. Показов 6590. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.10.2012, 17:48
Ответы с готовыми решениями:

Скрипт в результате выдает число целое, а надо с двумя знаками после запятой
Добрый день. Скрипт в результате выдает число целое, надо с двумя знаками после запятой, так как option value="1,5". Может кто...

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

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

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

Добавлено через 2 минуты
И ещё вопрос,Math::Round округляет по правилам математики или отрезает знаки лишние?
123.4567 округлит до 123.45 или 123.46 ?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
11.10.2012, 21:10
Цитата Сообщение от calypso Посмотреть сообщение
Насколько я помню в BorlandC++ "/" используется как обычное деление,не целочисленное..
В С если и делимое и делитель целочисленные то и деление целочисленное если хоть один операнд плавающий то и деление плавающее
Цитата Сообщение от calypso Посмотреть сообщение
И ещё вопрос,Math::Round округляет по правилам математики или отрезает знаки лишние
посмотри
http://msdn.microsoft.com/ru-r... s3aby.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
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
12.10.2012, 20:54  [ТС]
Да действительно,и в 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
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
12.10.2012, 21:59
Цитата Сообщение от 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
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
13.10.2012, 00:33
Цитата Сообщение от 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
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
13.10.2012, 00:57
Цитата Сообщение от lazybiz Посмотреть сообщение
А почему нельзя попробовать на Си?
можно че нельзя то
просто человек чисто сдвигами хотел
а C не поддерживает циклических сдвигов да и через перенос не работает

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

Добавлено через 3 минуты
и насчет скорости я бы не стал так безапелляционно заявлять
деление в сопре может занимать один такт,так же как и сдвиг (причем делает это параллельно)
накладные расходы закинуть в сопр и вытащить
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
13.10.2012, 19:17
Ах да, забыл. Ну тогда можно через умножение. Оно тоже быстрее деления.
C
1
result = value64 * .0009765625;
Мне трудно понять сленговые слова вроде "сопра" и "дубля". Говори понятным языком.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
13.10.2012, 19:29
Цитата Сообщение от lazybiz Посмотреть сообщение
"сопра" и "дубля". Говори понятным языком.
сопр- арифметический сопроцессор встроен в процессор начиная с 486DX
дубль,дубля калька с английского double

Добавлено через 3 минуты
Цитата Сообщение от lazybiz Посмотреть сообщение
value64 * .0009765625;
умножаем на .0009765625 т.е double
опять включается сопроцессор а для него и деление и умножение одинаковой сложности
не путай с процессором где деление занимает до 36 тактов
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
13.10.2012, 19:30
Цитата Сообщение от ValeryS Посмотреть сообщение
деление в сопре может занимать один такт
А может и не занимать. Зависит от процессора.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
13.10.2012, 19:34
Цитата Сообщение от lazybiz Посмотреть сообщение
Зависит от процессора.
еще раз сопроцессора! он специально заточен под математические операции
Я сейчас не могу найти книгу с растактовкой, но можешь поверить на слово деление там намного быстрее чем в процессоре
0
1 / 1 / 1
Регистрация: 29.09.2011
Сообщений: 57
13.10.2012, 19:42  [ТС]
а сразу делить на 1048576.0 для мегабайт и 1073741824.0 для гигабайт
У меня алгоритм просто такой: получаем размер диска и свободного, 2 раза делим на 1024.0 - если число больше 10000 значит делим ещё раз на 1024.0 и размер выводим в ГБ,иначе в МБ
Например, диск С: Размер 125,67 ГБ ,свободное место 2437,34 МБ
диск D: Размер 35,67 ГБ ,свободное место 13,45 ГБ

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

К примеру. Процессор 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/... tables.pdf
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.10.2012, 19:42
Помогаю со студенческими работами здесь

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

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

Дано целое число 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) Дано целое число m.Получить наибольшее целое...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru