什么操作将浮点数转换为“组”?

时间:2009-02-27 07:19:03

标签: c language-agnostic math floating-point puzzle

根据基于乘法的操作,可能有人用技巧和技术强制将有效浮点数集合作为一个组吗?

也就是说,给定任意两个浮点数(“double a,b”),包括乘法在内的什么操作序列会将其转换为另一个有效的浮点数? (有效的浮点数是1标准化的,不包括NaN,非正规和-0.0)。

把这个粗略的代码:

double a = drand();
while ( forever ) 
{
    double b = drand();
    a = GROUP_OPERATION(a,b); 
    //invariant - a is a valid floating point number
}    

由于NaNs的原因,仅仅乘法不起作用。理想情况下,这将是一种直线方法(避免“如果高于X,除以Y”公式)。

如果这对所有有效的浮点数都不起作用,是否存在可以进行此类操作的子集?

(我正在寻找的模型类似于C中的整数乘法 - 无论两个整数相乘,你总是得到一个整数)。

5 个答案:

答案 0 :(得分:3)

  

(我正在寻找的模型类似于C中的整数乘法 - 无论两个整数相乘,你总是得到一个整数。)

整数模2 ^ N不形成一个组 - 乘以2的整数给出1?要使整数成为乘法组,您必须以素数为模。 (例如Z mod 7,2 * 4 = 1,所以2和4是彼此的反转)

对于浮点值,简单的乘法或加法饱和到+/-无穷大,并且没有无穷大的逆的值,因此要么没有关闭,要么没有可逆性。

另一方面,如果你想要一个类似于整数乘法的东西,模数为2的幂,那么乘法会做 - 有些元素没有逆,所以它不是一个组,但它是关闭的 - 你总是得到一个浮点价值回来。对于真正组的浮点子集,请参阅lakshmanaraj的答案。

答案 1 :(得分:1)

由于舍入错误,浮点数在您正在谈论的意义上永远不会形成一个组。考虑数值分析类中任何可怕的例子,比如0.1不能用二进制表示。

但是,即使是计算整数也没有形成这种意义上的群体,因为它们在乘法运算中也没有被关闭。 (证明:计算while true do x = x*x的结果。在某些时候,你将超过单词大小,用完BIGNUM的资源或其他东西。)

更新@UnderAchievementAward:

- 添加到这里,所以我可以进行格式化,不像评论

  

由于我从浮点(而不是“真实”数字)开始,我不能避免任何0.1表示问题吗? “x = x * x”问题是为什么需要额外的操作来保持结果在有效范围内的原因。

好的,但是你会遇到一些情况,那里会存在一些 x,y st0≤x,y< max 其中 xy < 0.或者同样不直观的东西。

关键是你当然可以定义一组操作,它们看起来像一个有限表示集上的一个组,但如果你试图将它用作普通的算术运算,它会做一些奇怪的事情。

答案 2 :(得分:1)

浮点数由位支持。这意味着您可以对浮点值的整数表示使用整数算法,您将得到一个组。

不确定这是非常有用的。

/* You have to find the integer type whose size correspond to your double */
typedef double float_t;
typedef long long int_t;

float_t group_operation(float_t a, float_t b)
{
  int_t *ia, *ib, c;
  assert(sizeof(float_t) == sizeof(int_t));
  ia = &a;
  ib = &b;
  c = *ia * *ib;
  return (float_t)c;
}

答案 3 :(得分:0)

如果组操作是乘法的话 如果n是最高位,则r1 = 1 / power(2,n-1)是您可以操作的最小十进制数和设置 [r1,2 * r1,4 * r1,8 * r1 ... 1] union [-r1,-2 * r1,-4 * r1,....- 1] union [0]将是那个组你在期待。 对于整数[1,0,-1]是该组。

如果群组操作可以是其他任何东西, 然后形成n组有效组,

从r = 0到n-1的A(r)= cos(2 * Pi * r / n)

和小组操作是

COS(COSINV(A1)+ COSINV(A2))

我不知道你是否想要这个......

或者如果您想将INFINITY设置为有效组,则

简单回答: 组操作= AVG(A1,A2)=(A1 + A2)/ 2

或某些函数存在F,它具有FINV,因为它是反向的然后是FINV(F(A1)+ F(A2)/ 2) F的例子是Log,inverse,square等。

 double a = drand();
while ( forever ) 
{
    double b = drand();
    a = (a+b)/2
  //invariant - a is a valid floating point number
}

或者如果您想将INFINITY设置的DIGITAL格式作为有效组 令L为最低浮点数,H为最高浮点数

然后GROUP OPERATION = 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的子集。

答案 4 :(得分:0)

整数不会在乘法下形成一个组 - 0没有 逆。