adsl club

Справочник

Форум

Программы

Фильмы

Ресурсы

Файлообмен

Хостинг

Ростелеком
Переполнение
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ
Автор Сообщение
ДобрыйФей
Мечтатель
Предупреждений : 5
СообщениеДобавлено: Вт 29-12-09 : 07-02    Заголовок сообщения: Переполнение Ответить с цитатой

Есть функция, принимающая геометрию диска в LBA, а возращающая ее в CHS.
Код:
int g_lba2chs(tLBA lba,tCHS *g1)
{long int L1,nlog;
 L1=lba/63;
 nlog=L1/1023;
 if (nlog<2) nlog=2;
  else if (nlog<4) nlog=4;
        else if (nlog<8) nlog=8;
              else if (nlog<16) nlog=16;
                   else if (nlog<32) nlog=32;
                        else if (nlog<64) nlog=64;
                              else if (nlog<128) nlog=128;
                                    else nlog=255;
 g1->H=nlog;
 g1->C=L1%nlog;
 g1->S=63;
return(0);
}

На входе каг бэ количество секторов. Суть в чем: если оно будет большим (12345678, например), то возникает переполнение. Что с этим можно сделать?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
BuXTeR
Продвинутый форумчанин
СообщениеДобавлено: Вт 29-12-09 : 07-20    Заголовок сообщения: Ответить с цитатой

tLBA как объявлен? Объяви как unsigned long
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
ДобрыйФей
Мечтатель
Предупреждений : 5
СообщениеДобавлено: Вт 29-12-09 : 07-40    Заголовок сообщения: Ответить с цитатой

BuXTeR
Обычный лонг.
Кстати, как указать, что тип беззнаковый, unsigned long long y?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
AlexRock
Гуру
СообщениеДобавлено: Вт 29-12-09 : 11-38    Заголовок сообщения: Ответить с цитатой

ДобрыйФей
А почему какой-нибудь double нельзя?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
BuXTeR
Продвинутый форумчанин
СообщениеДобавлено: Вт 29-12-09 : 13-11    Заголовок сообщения: Ответить с цитатой

ДобрыйФей
Цитата:
Кстати, как указать, что тип беззнаковый, unsigned long long y?

Код:
unsigned long y;


Что-то у тебя странное. Для хранения 12345678 long`а вполне хватит. Может ошибка в другом?
Вообще, вот алгоритм с вики:
Код:
From LBA to CHS

The equations to convert from LBA to CHS follow:

 CYL = LBA / (HPC * SPT)
TEMP = LBA % (HPC * SPT)
HEAD = TEMP / SPT
SECT = TEMP % SPT + 1

Where:

 LBA: linear base address of the block
 CYL: value of the cylinder CHS coordinate
 HPC: number of heads per cylinder for the disk
HEAD: value of the head CHS coordinate
 SPT: number of sectors per track for the disk
SECT: value of the sector CHS coordinate
TEMP: buffer to hold a temporary value


AlexRock писал(а):
А почему какой-нибудь double нельзя?

А зачем использовать тип данных для чисел с плавающей точкой, если нужно хранить целые?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
AlexRock
Гуру
СообщениеДобавлено: Вт 29-12-09 : 16-00    Заголовок сообщения: Ответить с цитатой

BuXTeR писал(а):
А зачем использовать тип данных для чисел с плавающей точкой, если нужно хранить целые?

А разве целое число не частный случай вещественного? Зато в дабл большее число влезет.

А ошибка у него может быть в том, что он делит целое на другое целое и у него может получиться вещественное, и при этом у него нет никаких приведений. Либо он получает вещественное в результате деления и пытается присвоить его целому:

ДобрыйФей писал(а):
long int L1,nlog;

 L1=lba/63; // где гарантия, что lba/63 - целое?

 nlog=L1/1023;

63 по-моему вообще только на три числа целочисленно делятся без остатка - 1, 21 и 63. Может, тут лучше не вещественное деление, а целочисленное использовать?


ДобрыйФей писал(а):
Суть в чем: если оно будет большим (12345678, например), то возникает переполнение. Что с этим можно сделать?

Ошибку переполнения неплохо бы сюда запостить - что IDE пишет? А то некоторые не так понимают.

И язык ещё неплохо бы указать - а то этих сиподобных развелось много.
Последний раз редактировалось: AlexRock (Вт 29-12-09 : 18-37), всего редактировалось 1 раз
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
BuXTeR
Продвинутый форумчанин
СообщениеДобавлено: Вт 29-12-09 : 17-00    Заголовок сообщения: Ответить с цитатой

Alexrock писал(а):
L1=lba/63; // где гарантия, что lba/63 - целое?

long делится на long (насколько помню, компилятор приведет константу "63" к тому же типу), результат присваивается в long. Дробная часть откидывается уже на этапе деления. Какие тут могут быть проблемы? Нужно определить номер цилиндра. Типа там, "на пятидесятом цилиндре". Нафиг тут дробная часть?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
Aprelle
Гуру
СообщениеДобавлено: Вт 29-12-09 : 18-26    Заголовок сообщения: Ответить с цитатой

AlexRock писал(а):
На 63 по-моему вообще только три числа целочисленно делятся без остатка - 1, 21 и 63.

Сибирские математики настолько суровы...
Под столом!
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
AlexRock
Гуру
СообщениеДобавлено: Вт 29-12-09 : 18-40    Заголовок сообщения: Ответить с цитатой

Aprelle писал(а):
AlexRock писал(а):На 63 по-моему вообще только три числа целочисленно делятся без остатка - 1, 21 и 63.


Сибирские математики настолько суровы...

Ошибся - наоборот, конечно. )) Ладно, я не в теме, поэтому не буду. ))

...Но всё равно непонятно, почему нельзя double вместо int для целых использовать? Ведь он же хочет ооочень большое число хранить - неужели проще несколько int использовать, чтобы разные разряды хранить, чем одно double?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Aprelle
Гуру
СообщениеДобавлено: Вт 29-12-09 : 18-52    Заголовок сообщения: Ответить с цитатой

кого наоборот то? 63:21 сколько будет? будет ли это делителем 63-х?
есть ли делители у 21?
зачем для целочисленных вычислений применять double? для того, чтобы тормозить программу?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
AlexRock
Гуру
СообщениеДобавлено: Вт 29-12-09 : 19-33    Заголовок сообщения: Ответить с цитатой

Aprelle писал(а):
зачем для целочисленных вычислений применять double? для того, чтобы тормозить программу?

Ну, может ещё как-то можно большое число (больше максимального для unsigned long int) хранить, просто мне это первое в голову пришло. А что, сильно затормозиться программа при вычислении геометрии нескольких ЖД в компе?
Aprelle писал(а):
кого наоборот то? 63:21 сколько будет? будет ли это делителем 63-х?

есть ли делители у 21?

Да вот это я имел ввиду:
AlexRock писал(а):
63 по-моему вообще только на три числа целочисленно делятся без остатка - 1, 21 и 63.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Aprelle
Гуру
СообщениеДобавлено: Вт 29-12-09 : 23-07    Заголовок сообщения: Ответить с цитатой

AlexRock писал(а):
Да вот это я имел ввиду:

да я прекрасно знаю, что ты имел ввиду, а ты так и не понял к чему я веду?
Не знать таблицу Пифагора - низачот.
Число не может иметь 3 делителя, если это не квадрат простого числа.
63 является квадратом простого?
Делители 63: 1, 3, 7, 9, 21, 63

А программа может и не сильно затормозится, но использование вещественных чисел с приведением к целым - может вызвать ошибку.
Например вместо результата 12345 будет результат 12344.9999999999997,
который приведется к 12344, что не случилось бы при целочисленном делении.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
AlexRock
Гуру
СообщениеДобавлено: Вт 29-12-09 : 23-58    Заголовок сообщения: Ответить с цитатой

Aprelle писал(а):
да я прекрасно знаю, что ты имел ввиду, а ты так и не понял к чему я веду?

Не знать таблицу Пифагора - низачот.

Число не может иметь 3 делителя, если это не квадрат простого числа.

63 является квадратом простого?

Делители 63: 1, 3, 7, 9, 21, 63

Точно. Эт я ступил. ))
Aprelle писал(а):
А программа может и не сильно затормозится, но использование вещественных чисел с приведением к целым - может вызвать ошибку.

Например вместо результата 12345 будет результат 12344.9999999999997,

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

Ладно, я тут сам виноват - не достаточно знаний. Но равзе нет в других языках каких-нибудь больших целых переменных? Вот, в C# есть 64-битное целое:
Цитата:
long -9223372036854775808 до 9223372036854775807 Знаковое 64-бит целое
ulong 0 до 18446744073709551615 Беззнаковое 64-бит целое

- для многих задач достаточно, а для задачи топикстартера уж точно (не то, что секторов, а даже просто бит на один винчестер столько ещё нет и не скоро будет). Вообще, топикстартер ещё даже не ответил, где тут переполнение для его 32-битного long - такое количество секторов тоже наврядли есть.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Показать сообщения:   
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ Часовой пояс: GMT + 7
Страница 1 из 1

 

 
Аватары: Вкл|Выкл   ЮзерИнфо: Вкл|Выкл   Подписи: Вкл|Выкл
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы