Автор |
Сообщение |
ДобрыйФей Мечтатель Предупреждений : 5
|
|
Есть функция, принимающая геометрию диска в 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 Продвинутый форумчанин |
|
tLBA как объявлен? Объяви как unsigned long |
|
|
|
|
ДобрыйФей Мечтатель Предупреждений : 5
|
|
BuXTeR
Обычный лонг.
Кстати, как указать, что тип беззнаковый, unsigned long long y? |
|
|
|
|
AlexRock Гуру |
|
ДобрыйФей
А почему какой-нибудь double нельзя? |
|
|
|
|
BuXTeR Продвинутый форумчанин |
|
ДобрыйФей
Цитата: |
Кстати, как указать, что тип беззнаковый, unsigned long 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 нельзя? |
А зачем использовать тип данных для чисел с плавающей точкой, если нужно хранить целые? |
|
|
|
|
AlexRock Гуру |
|
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 Продвинутый форумчанин |
|
Alexrock писал(а): |
L1=lba/63; // где гарантия, что lba/63 - целое? |
long делится на long (насколько помню, компилятор приведет константу "63" к тому же типу), результат присваивается в long. Дробная часть откидывается уже на этапе деления. Какие тут могут быть проблемы? Нужно определить номер цилиндра. Типа там, "на пятидесятом цилиндре". Нафиг тут дробная часть? |
|
|
|
|
Aprelle Гуру |
|
AlexRock писал(а): |
На 63 по-моему вообще только три числа целочисленно делятся без остатка - 1, 21 и 63. |
Сибирские математики настолько суровы...
|
|
|
|
|
AlexRock Гуру |
|
Aprelle писал(а): |
AlexRock писал(а):На 63 по-моему вообще только три числа целочисленно делятся без остатка - 1, 21 и 63.
Сибирские математики настолько суровы... |
Ошибся - наоборот, конечно. )) Ладно, я не в теме, поэтому не буду. ))
...Но всё равно непонятно, почему нельзя double вместо int для целых использовать? Ведь он же хочет ооочень большое число хранить - неужели проще несколько int использовать, чтобы разные разряды хранить, чем одно double? |
|
|
|
|
Aprelle Гуру |
|
кого наоборот то? 63:21 сколько будет? будет ли это делителем 63-х?
есть ли делители у 21?
зачем для целочисленных вычислений применять double? для того, чтобы тормозить программу? |
|
|
|
|
AlexRock Гуру |
|
Aprelle писал(а): |
зачем для целочисленных вычислений применять double? для того, чтобы тормозить программу? |
Ну, может ещё как-то можно большое число (больше максимального для unsigned long int) хранить, просто мне это первое в голову пришло. А что, сильно затормозиться программа при вычислении геометрии нескольких ЖД в компе?
Aprelle писал(а): |
кого наоборот то? 63:21 сколько будет? будет ли это делителем 63-х?
есть ли делители у 21? |
Да вот это я имел ввиду:
AlexRock писал(а): |
63 по-моему вообще только на три числа целочисленно делятся без остатка - 1, 21 и 63. |
|
|
|
|
|
Aprelle Гуру |
|
AlexRock писал(а): |
Да вот это я имел ввиду: |
да я прекрасно знаю, что ты имел ввиду, а ты так и не понял к чему я веду?
Не знать таблицу Пифагора - низачот.
Число не может иметь 3 делителя, если это не квадрат простого числа.
63 является квадратом простого?
Делители 63: 1, 3, 7, 9, 21, 63
А программа может и не сильно затормозится, но использование вещественных чисел с приведением к целым - может вызвать ошибку.
Например вместо результата 12345 будет результат 12344.9999999999997,
который приведется к 12344, что не случилось бы при целочисленном делении. |
|
|
|
|
AlexRock Гуру |
|
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 - такое количество секторов тоже наврядли есть. |
|
|
|
|
|
Аватары: Вкл|Выкл ЮзерИнфо: Вкл|Выкл Подписи: Вкл|Выкл
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы можете скачивать файлы
|
|