在处理大和负实数时,有没有人知道如何使下面的Matlab代码更准确地逼近指数函数?
例如,当x = 1时,代码效果很好,当x = -100时,它应该更接近3.7201e-44时返回8.7364e + 31的答案.
代码如下:
s=1
a=1;
y=1;
for k=1:40
a=a/k;
y=y*x;
s=s+a*y;
end
s
Run Code Online (Sandbox Code Playgroud)
欢迎任何帮助,欢呼.
编辑:
好的,问题如下:
这段代码接近哪个数学函数?(我说指数函数.)当x = 1时它是否有效?(是的.)不幸的是,当x = -100时使用它会产生答案s = 8.7364e + 31.您的同事认为该程序中存在一个愚蠢的错误,并请求您的帮助.仔细解释行为并给出一个简单的修复,产生更好的结果.[您必须建议对上述代码进行修改,或者使用它.您还必须检查您的简单修复工作.]
所以我有点明白,当术语之间存在16个(或更多)数量级时,问题会围绕大数字,精度会丢失,但解决方案不能解决.
谢谢
编辑:
所以最后我接受了这个:
s = 1;
x = -100;
a = 1;
y = 1;
x1 = 1;
for k=1:40
x1 = x/10;
a = a/k;
y = y*x1;
s = s + a*y;
end
s = s^10;
s
Run Code Online (Sandbox Code Playgroud)
不确定它是否完全正确但它会返回一些好的近似值.
exp(-100)= 3.720075976020836e-044 …
我必须做一些需要使用三角函数的计算,特别是那个atan.代码将在Atmega328p上运行,为了提高效率,我不能使用floats:我使用的是定点数.因此,我无法使用标准atan功能.
我有一个函数,它采用定点格式的值s16_10(有符号,16位宽,第10位),并返回s16_6格式.输入将介于0和1之间(因此为0和2 10),因此输出(以度为单位)将介于-45和45之间(因此-45*2 6和45*2 6).
假设Y是固定点,y是s16_6表示,弧的实际角度,x是x atan(x) = y,X是s16_10的x表示.我从使用atan4度多项式近似函数,从(0,1)到(-45,45)开始,发现我们可以使用:
y ~= 8.11 * x^4 - 19.67 * x^3 - 0.93 * x^2 + 57.52 * x + 0.0096
Run Code Online (Sandbox Code Playgroud)
这导致:
Y ~= (8.11 * X^4)/2^34 - (19.62* X^3)/2^24 - (0.93 * X^2)/2^14 + (57.52*X)/2^4 + 0.0069 * 2^6
Run Code Online (Sandbox Code Playgroud)
在这里我被卡住了......一方面,计算X^4将导致定义间隔的五分之一为0,另一方面,{ 3,2,1 }中的2 n4 n通常也会导致零价值......我怎么办?
我是Python的新手,被要求创建一个程序,该程序将输入作为非负整数n,然后使用连续分数的前n + 1个项来计算e的近似值:
我试图破译这个问题,但无法完全理解它所问的一切。我不是在寻找确切的答案,而是希望有一个例子可以对我有所帮助。
这是确切的问题,
下面是我之前对连续分数所做的代码。
import math
# Get x from user
x = float(input("Enter x = "))
# Calculate initial variables and print
a0 = x//1
r0 = x-a0
print("a0 =", a0, "\tr0 =", r0)
# Calculate ai and ri for i = 1,2,3 and print results
a1 = 1/r0//1
r1 = 1/r0 - a1
print("a1 =", a1, "\tr1 =", r1)
a2 = 1/r1//1
r2 = 1/r1 - a2
print("a2 =", a2, "\tr2 =", r2)
a3 = 1/r2//1 …Run Code Online (Sandbox Code Playgroud) 我目前正在研究余弦的近似值。由于最终目标设备是使用 32 位浮点 ALU / LU 的自行开发,并且有专门的 C 编译器,因此我无法使用 C 库数学函数(cosf,...)。我的目标是编写在准确性和指令/周期数量方面不同的各种方法。
我已经尝试了很多不同的近似算法,从 fdlibm、泰勒展开、pade 近似、使用枫树的 remez 算法等开始......
但是,一旦我仅使用浮点精度来实现它们,就会显着降低精度。并且可以肯定:我知道双精度,更高的精度完全没有问题......
现在,我有一些近似值,在 pi/2(出现最大误差的范围)附近精确到几千 ulp,我觉得我受到单精度转换的限制。
为了解决主题参数减少:输入是弧度。我认为参数减少会由于除法/乘法而导致更多的精度损失......因为我的整体输入范围只有 0..pi,我决定将参数减少到 0..pi/2。
因此,我的问题是:有没有人知道高精度(并且在最好的情况下效率高)余弦函数的单精度近似值?是否有任何算法可以优化单精度的近似值?你知道内置的 cosf 函数是否在内部计算单精度双精度的值吗?~
float ua_cos_v2(float x)
{
float output;
float myPi = 3.1415927410125732421875f;
if (x < 0) x = -x;
int quad = (int32_t)(x*0.63661977236f);//quad = x/(pi/2) = x*2/pi
if (x<1.58f && x> 1.57f) //exclude approximation around pi/2
{
output = -(x - 1.57079637050628662109375f) - 2.0e-12f*(x - 1.57079637050628662109375f)*(x - 1.57079637050628662109375f) + 0.16666667163372039794921875f*(x - 1.57079637050628662109375f)*(x - 1.57079637050628662109375f)*(x - 1.57079637050628662109375f) …Run Code Online (Sandbox Code Playgroud) c floating-point trigonometry approximation single-precision
我正在开发Java/Groovy程序.我有一个双变量,它包含一个用户输入的数字.我真正想知道的是用户在小数点右侧键入了多少个数字.就像是:
double num = 3.14
num.getPlaces() == 2
Run Code Online (Sandbox Code Playgroud)
当然,你不能用double来做这个,因为那是使用IEEE浮点数而且它都是近似值.
假设我无法获取用户输入的字符串,但只能访问已存储的值的double,有没有办法可以通过BigDecimal擦除那个double,或者某些东西可以得到"真实"的数字小数位?(当双重显示在屏幕上时,它会正确,所以我认为有一种方法至少可以猜到吗?)
我附图: alt text http://i.piccy.info/i4/42/5f/ca0c6fc155fb40d420f62888829f.jpeg
所以在这个图像中有一个函数图,它在给定的点上定义.例如,在点x = 1..N上.
另一个图,绘制为半透明曲线,这是我想从原始图中得到的,即我想近似原始函数,使其变得平滑.
有没有办法做到这一点?
我听说过最小二乘法,可用于通过直线或抛物线函数逼近函数.但我不需要用抛物线函数来近似.我可能需要通过三角函数来近似它.那么有没有办法做到这一点?还有一个想法,如果我们可以推导它用于三角函数,是否可以使用最小二乘法来解决这个问题?
还有一个问题!如果我使用离散傅立叶变换并将函数视为波的总和,那么噪声可能具有我们可以定义它的特殊特征,然后我们可以将相应的频率设置为零,然后执行逆傅里叶变换.因此,如果您认为有可能,那么您可以建议什么来识别噪声的频率?
嗨所有我试图除以无符号常数除以仅使用移位和加/减 - 如果它是乘法我没有问题,但我有点被分裂困扰.
例如,假设常数除数为192,可以说红利为8000
"完整结果"y = 8000/192 = 41(假设我没有保留小数位)
y = 8000 >> 8 ... 31 y = 8000 >> 7 ... 62
但是,我如何获得更准确的解决方案?
非常感谢!
如何用一些简单的分析函数f(s,Г)来近似反不完全伽马函数 Г(s,x)?这意味着写出类似x = f(s,Г)= 12*log(123.45*Г)+Г+ 123.4 ^ s的东西.
(我至少需要想法或参考.)
我做了一个函数来计算atan2(y,x)的定点近似.问题在于运行整个函数所需的~83个循环,70个循环(在AMD FX-6100上使用gcc 4.9.1 mingw-w64 -O3进行编译)完全由一个简单的64位整数除法完成!遗憾的是,该分裂的任何条款都不变.我能加速分裂吗?有什么方法可以删除它吗?
我想我需要这个除法,因为我用1D查找表近似atan2(y,x)我需要将x,y表示的点的距离标准化为单位圆或单位正方形(我选择了一个单位')菱形'是一个旋转45°的单位正方形,在正象限上提供非常均匀的精度).所以除法找到(| y | - | x |)/(| y | + | x |).注意,除数是32位,而分子是32位数,右移29位,因此除法的结果有29个小数位.同样使用浮点除法不是一个选项,因为此函数不需要使用浮点运算.
有任何想法吗?我想不出有什么可以改善这一点(我无法弄清楚为什么只需要一个师就需要70个周期).这是完整的参考功能:
int32_t fpatan2(int32_t y, int32_t x) // does the equivalent of atan2(y, x)/2pi, y and x are integers, not fixed point
{
#include "fpatan.h" // includes the atan LUT as generated by tablegen.exe, the entry bit precision (prec), LUT size power (lutsp) and how many max bits |b-a| takes (abdp)
const uint32_t outfmt = 32; // final output format in s0.outfmt
const …Run Code Online (Sandbox Code Playgroud) 我有一个类似于以下内容的数据框:
+---+-----+-----+
|key|thing|value|
+---+-----+-----+
| u1| foo| 1|
| u1| foo| 2|
| u1| bar| 10|
| u2| foo| 10|
| u2| foo| 2|
| u2| bar| 10|
+---+-----+-----+
Run Code Online (Sandbox Code Playgroud)
并希望得到以下结果:
+---+-----+---------+----+
|key|thing|sum_value|rank|
+---+-----+---------+----+
| u1| bar| 10| 1|
| u1| foo| 3| 2|
| u2| foo| 12| 1|
| u2| bar| 10| 2|
+---+-----+---------+----+
Run Code Online (Sandbox Code Playgroud)
目前,有类似的代码:
val df = Seq(("u1", "foo", 1), ("u1", "foo", 2), ("u1", "bar", 10), ("u2", "foo", 10), ("u2", "foo", 2), ("u2", "bar", 10)).toDF("key", "thing", "value")
// calculate …Run Code Online (Sandbox Code Playgroud) approximation rank window-functions apache-spark apache-spark-sql
approximation ×10
math ×5
c ×2
trigonometry ×2
apache-spark ×1
assembly ×1
atmega ×1
exp ×1
fixed-point ×1
groovy ×1
java ×1
matlab ×1
optimization ×1
performance ×1
python ×1
python-3.x ×1
rank ×1
statistics ×1