Моя идея состояла в том, чтобы проверить повторение в битах Mantissa с различным смещением и подсчетом сравнения битов < /p>
в '110011001100 ...' повторяет '1100' (так это это. Повторяет (иррациональный)
in '000100100100 ...' repeats '001' (рациональный) с смещением 1 бит и размером 3 бита
< /pre>
Но мой код всегда возвращает только true < /p>
Код: Выделить всё
public static final long SIGNIF_BIT_MASK = 0x000FFFFFFFFFFFFFL;
public static final int SIGNIFICAND_WIDTH = 52;
public static boolean isRational(double input) {
// cases when easy to determine rational/irrational
if(Double.isNaN(input))return false;
if(Math.getExponent(input)>SIGNIFICAND_WIDTH)return true;
if(Math.floor(input)==input)return true;
long mantissa = Double.doubleToRawLongBits(input)&SIGNIF_BIT_MASK;
//offset up to 26 bits, more bits == more inaccurate
for(int h = 0; h < SIGNIFICAND_WIDTH/2; h++){
//width (i=1: 0b?, i=2: 0b?? ...), max is half of remaining bits
for (int i = 1; i < (SIGNIFICAND_WIDTH-h) / 2; i++) {
//extract needed bits
long mask1_____ = ((1L = SIGNIFICAND_WIDTH - i - h;
//i think that variable is the problem, but i can't solve it
int success = 0;
//check other groups
for (int j = 1; j
Подробнее здесь: [url]https://stackoverflow.com/questions/79778218/checking-is-double-value-rational[/url]
Мобильная версия