我编写了这样一个代码来寻找网格步长(两个相邻的机器可表示数之间的差,机器ε,最小机器可表示数大于1和1之间的差)。为什么这个程序显示1代表巨大的价值关于x,以及如何修正它以显示正确答案?
#include <stdio.h>
int main(void)
{
long double x,eps=1.0,a;
scanf("%Lg",&x);
do
{
a=eps;
eps/=2.0;
}
while( x+eps>x);
printf("Grid step: %Le",(long double)a);
return 0;
}
浮点数表示为符号(1或−1) s、指数e和数字f,在固定的基数中有固定的位数(称为有效位)。以基数b和精度(位数)p表示,用符号s、指数e和数字f0,f−1,f−2,f−3,f−4,…f1−p是s•be•和(fi•bi)−P
例如,对于基数2、精度4、符号1、指数1和有效位1.001,表示的数字是1•21•1.0012=2•1⅛ = 2¼ = 9/4 = 2.25.
给定边界内的任何可表示数,下一个更大量级的可表示数是通过将有效位的最低位数加1来获得的。在上述示例中,下一个较大的数字的有效位为1.010,符号和指数相同,因此它将为1•21•1.0102=2•1¼=2½=10/4=2.5。
这意味着,如果一个数x
用指数e表示,那么它和下一个更大幅度的可表示数之间的区别是beb1−p=be 1−p。
数字1用指数0表示,因为1=1•b0•1.000…000b。所以1和下一个可表示数之间的差是b1−p。如果long double
格式的基数为2,精度为64位,则此差值为21−64=2−63,所以所谓的“机器ε”的值应该是2−63。
如果使用二进制格式,则2用指数1表示,因此它与下一个可表示数字之间的差值为be1−p=21−64=2−62。这些差异被称为ULP,精度最低的单位。
4的ULP为2−61,8的ULP为2−60,依此类推。对于263,ULP为263−63=1。
当您输入264或更大的数字时,您的程序无法找到ULP,因为ULP大于1,但是您的程序开始看1并向下工作。
您可以通过在long double
格式中从尽可能最大的ULP开始,或者根据x
的值,将程序更改为向上或向下运行来修复它。
具有矩阵A的: 我想计算所有行中两个相邻数字之间的最大和最小差异。然后过滤以仅限制相邻数字min小于4和7之间的行,最大值在6和12之间的行。输出应该返回无行。 对于以下矩阵: 结果应该是第1行
问题内容: 我有计算纯python中相邻元素之间差异的算法: 有什么办法可以用Numpy重写此功能? 问题答案: 有方法: 退货
我正在尝试解决此问题: 一位物理教授给班上的学生做项目。学生们必须组成一个两人小组来做这个项目。教授让学生来决定队伍。一个班级的学生人数将是偶数。 每个学生都有自己的知识水平。它告诉每个学生有多少知识。一个团队的知识水平是两个学生知识水平的总和。 学生们决定组成小组,这样知识最高的团队和知识最低的团队之间的差异就最小了。 投入 输入的第一行将包含测试用例的数量t;在接下来的t行中,第一个数字是n,
问题内容: 我有以下两个数组。我想要这两个数组之间的区别。也就是说,如何找到两个数组都不存在的值? 问题答案: 注意: 这个答案将返回的值是不存在的,它不会返回值不在。
所以我试着使用一个嵌套循环,将长度加到一个int数组中,然后遍历int数组,找到最大的数,但它没有通过测试用例,我开始想,也许我把这个问题复杂化了,有一个更简单的方法。这是我试过的。