根据基于乘法的操作,可能有人用技巧和技术强制将有效浮点数集合作为一个组吗?
也就是说,给定任意两个浮点数(“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中的整数乘法 - 无论两个整数相乘,你总是得到一个整数)。
答案 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的资源或其他东西。)
- 添加到这里,所以我可以进行格式化,不像评论
由于我从浮点(而不是“真实”数字)开始,我不能避免任何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没有 逆。