Моя идея заключалась в том, чтобы проверить повторение в битах мантиссы с различным смещением и количеством сравниваемых бит
в '110011001100...' повторяется '1100' (так что это рационально) со смещением 0 бит и размером 4 бита
в '101100111000...' ничего повторяется (иррационально)
в '000100100100...' повторяется '001' (рационально) со смещением в 1 бит и размером в 3 бита
Но мой код всегда возвращает только true
Код: Выделить всё
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
value < /th>
< /tr>
< /thead>
51-46 < /td>
110001 < /td>
< /tr>
110001 < /td>
< /tr> /> 45-40 < /td>
110001 < /td>
< /tr>
td>....
.... /> 110001 < /td>
< /tr>
09-04 < /td>
110001 < /td>
< /tr>
03-00 < /td>
. /> < /tr>
< /tbody>
< /table> < /div>
Пример для 1/7 < /p>
< /th> < /th> < /bits < /th> < /bits < /th> < /bits < /th> < /bits < /bits < /th> < /bits < /th> < /bits < /bits < /bits < /bits < /bits < /bits < /bits < /th> /> < /tr>
< /thead>
51-49 < /td>
001 < /td>
< /tr>
48-46 < /td>
< /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> < /td> 001 < /td> 48-46 < /td>
/> < /tr>
...
....
< /tr>
06-04 < /td>
001 < /td>
< /tr>
001 < /td>
< /td>
001 < /td>
< /td> /> 03-01 < /td>
001 < /td>
< /tr>
00-00 < /td>
0 (игнорируется) < /td>
< /tr>
< /tbody>
< /td>
< /tr>
< /tbody> < /td. /> Также в качестве примера https://desmos.com/calculator/ может определить, является ли число «рационально»;
Подробнее здесь: [url]https://stackoverflow.com/questions/79778218/checking-is-double-value-rational[/url]
Мобильная версия