Если групповая операция является умножением, то
если n - старший бит, то r1 = 1 / мощность (2, n-1) - это наименьшее десятичное число, которое вы можете использовать, и
[r1,2 * r1,4 * r1,8 * r1 ... 1] union [-r1, -2 * r1, -4 * r1, ....- 1] union [0] будет группой, которая вы ожидаете.
Для целого числа [1,0, -1] - группа.
если групповая операция может быть чем-то другим,
затем сформировать набор допустимых групп,
A (r) = cos (2 * Pi * r / n) от r = 0 до n-1
и групповая операция
COS (COSINV (А1) + COSINV (А2))
Я не знаю, хотите ли вы этого .....
или если вы хотите, чтобы INFINITY была установлена в качестве допустимой группы, тогда
простой ответ:
ГРУППОВАЯ ОПЕРАЦИЯ = AVG (A1, A2) = (A1 + A2) / 2
или существует некоторая функция F, которая имеет FINV как обратное, а затем FINV (F (A1) + F (A2) / 2)
Примером F является Log, обратный, квадрат и т. Д.
double a = drand();
while ( forever )
{
double b = drand();
a = (a+b)/2
//invariant - a is a valid floating point number
}
или если вы хотите, чтобы INFINITY установил ЦИФРОВОЙ формат в качестве допустимой группы, тогда
Пусть L будет самым низким числом с плавающей точкой, а H будет самым большим числом с плавающей точкой
, затем ГРУППОВАЯ ОПЕРАЦИЯ = AVG (A1, A2, L, H) = (A1 + A2 + L + H) / 4
эта операция всегда будет в пределах L & H для всех положительных чисел.
Для практических целей вы можете взять L в четыре раза меньше самого низкого десятичного числа и H в качестве (наибольшего десятичного числа / 4).
double l = (0.0000000000000000000000000//1) * 4
double h = (0xFFFFFFFFFFFFFFFFFFFFFF///F) / 4
double a = abs(drand()) / 4;
while ( forever )
{
double b = abs(drand()) / 4;
a = (a+b+l+h)/4
//invariant - a is a valid floating point number
}
это подмножество всех возможных чисел с плавающей точкой / 4.