Здравствуйте, Andrew S, Вы писали:
T>>>А в качестве индекса все равно поиспользовать не получится... хоть double используй, хоть __int64.
LVV>>Предел float 10^38 = 2^38*5^38
LVV>>2^42 = 2^4*2^38 = 16*2^38
LVV>>Очень даже организуешь!
LVV>>Или я где-то грабли не вижу?
AS>Конечно не видите, что, вообще говоря, странно...
AS>Распределение вещественных чисел, представляемых флоат (да и любым числом с плавающей точкой) на множестве вещественных чисел, неравномерно. Наиболее плотно числа представлены (отбросив знак) в районе единицы, далее, ближе к границам диапазона — значительно более разрежено. Т.е. далеко не все целые числа из диапазона флоата можно с точностью до +-0.5 им представить.
Наиболее плотно — в районе нуля
AS>Более того. Общее количество (вещественных) чисел, представляемых float, составляет примерно (точно я не помню) 2^25 + 1.
Больше. Намного больше. Чуть меньше 2^32 (меньше из-за того, что некоторые числа имеют неоднозначное представление, но таких чисел очень мало).
AS>Общее количество (вещественных) чисел, представляемых double, состоявляет 2^53 + 1,
Тоже ошибаешься. Порядка 2^64. Как и следовало ожидать.
AS>т.е. им представить 42 битное число с некоторой осторожностью можно (при этом, очевидно, от операции инкремента в виде прибавления единички к значению придется отказаться, придумав нечто другое, что не изменяло бы значения порядка, а только мантиссы).
Осторожность никогда не повредит, но в данном случае можно смело пользоваться double. При условии, что используются только +-*= и значение не вылазиет за 2^52.
AS>В общем — правильнее и быстрее использовать вложеный цикл на long, если компилер не поддерживает 64-х битные целые.
Правильнее? Наверное да. Быстрее? Сомниваюсь. Все зависит от задачи и "внутренностей" цикла.