是否存在一个IEEE双x>0这样sqrt(x*x) ? x,该计算的情况下x*x不会溢出或下溢到Inf,0或反规范多少?
这给出了sqrt返回最接近的可表示结果,并且同样如此x*x(两者都是IEEE标准规定的,"平方根操作被计算为无限精度,然后四舍五入到指定的两个最接近的浮点数之一)围绕无限精确结果的精度").
假设如果存在这样的双打,那么可能有接近1的例子,我写了一个程序来找到这些反例,并且它找不到任何之间1.0和1.0000004780981346.
以前类似的问题完全平方数和浮点数解答了其中的计算情况下,当负的问题x*x并没有涉及到舍入.这个答案对于这个问题是不够的,因为有可能x*x涉及在一个方向上sqrt(x*x)进行舍入,然后涉及在同一方向上进行舍入,从而产生一个不完全正确的答案x.
大多数编程语言都给出2了平方根的答案4.但是,有两个答案:2和-2.是否有任何特殊原因,历史或其他原因,为什么通常只给出一个答案?
如何创建一个返回给定nunber的sqrt的方法?
例如:sqrt(16)返回4并且sqrt(5)返回2.3 ...
我使用Java并且知道Math.sqrt()API函数但我需要方法本身.
我需要帮助编写一个使用二进制搜索的程序来递归计算输入非负整数的平方根(向下舍入到最接近的整数).
这是我到目前为止:
import java.util.Scanner;
public class Sqrt {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
System.out.print("Enter A Valid Integer: ");
int value = console.nextInt();
calculateSquareRoot(value);
}
public static int calculateSquareRoot(int value) {
while (value > 0) {
double sqrt = (int) Math.sqrt(value);
System.out.println(sqrt);
}
return -1;
}
}
Run Code Online (Sandbox Code Playgroud)
它必须使用二进制搜索来计算平方根这一事实让我感到困惑.如果有人对如何做到这一点有任何建议,将不胜感激.谢谢
也许这是一个算法问题,但是下面的一段代码
numpy.power((-1+0j),0.5)
产生以下输出
(6.1230317691118863e-17+1j)
numpy.power(complex(-1),.5)然而,类似的表达式产生相同的结果 - numpy.sqrt(complex(-1))产生预期的结果1j.显然,结果应该没有真正的部分,所以我遗漏了一些关键的东西,或者我需要向numpy dev's报告.
如果有人问,不,我不能完全摆脱真实部分(我需要完全精确的计算),是的,我需要使用电源功能.
double r2 = dx * dx + dy * dy;
double r3 = r2 * sqrt(r2);
Run Code Online (Sandbox Code Playgroud)
可以用更快的东西替换第二行吗?什么东西不涉及sqrt?
有两种方法可以仅使用整数运算来查找整数平方根.例如这一个.它有趣的阅读和一个非常有趣的理论,特别是对于我这一代,这些技术不再那么有用.
主要的是它不能使用浮点运算,因此排除了牛顿方法及其推导.我知道找到根的另一种方法是二项式扩展,但这也需要浮点运算.
有什么技术/算法可以仅使用整数运算来计算整数n个根?
编辑:感谢目前为止的所有答案.他们似乎都更加智能的试验和改进.有没有更好的方法?
编辑2:好的,所以没有试用/改进和牛顿方法或二进制搜索似乎没有聪明的方法来做到这一点.任何人都可以在理论上提供两者的比较吗?我在两者之间运行了一些基准测试,发现它们非常相似.
我听说过这里讨论的"快速反平方根",我想将它放在我的Java程序中(仅用于研究目的,因此忽略有关本机库的任何更快的事情).
我正在查看代码,而C代码直接将其float转换为int带有一些C指针魔法的代码.如果你试图在带有强制转换的Java中执行此操作,它就不起作用:java会截断浮动(正如您所期望的那样),并且您无法获取基元的指针(就像在C中一样).那你怎么做的?
我正在使用Dobb博士的文章" 使用定点运算优化数学密集型应用 "中描述的Anthony Williams的定点库,使用Rhumb Line方法计算两个地理点之间的距离.
当点之间的距离很大(大于几公里)时,这种方法运行良好,但在较小距离处则非常差.最坏的情况是当两个点相等或接近相等时,结果是194米的距离,而我需要距离> = 1米时至少1米的精度.
通过与双精度浮点实现的比较,我将问题定位到fixed::sqrt()函数,该函数在小值时表现不佳:
x std::sqrt(x) fixed::sqrt(x) error
----------------------------------------------------
0 0 3.05176e-005 3.05176e-005
1e-005 0.00316228 0.00316334 1.06005e-006
2e-005 0.00447214 0.00447226 1.19752e-007
3e-005 0.00547723 0.0054779 6.72248e-007
4e-005 0.00632456 0.00632477 2.12746e-007
5e-005 0.00707107 0.0070715 4.27244e-007
6e-005 0.00774597 0.0077467 7.2978e-007
7e-005 0.0083666 0.00836658 1.54875e-008
8e-005 0.00894427 0.00894427 1.085e-009
Run Code Online (Sandbox Code Playgroud)
fixed::sqrt(0)通过将其视为一种特殊情况来校正结果是微不足道的,但是这不能解决小的非零距离问题,其中误差从194米开始并且随着距离的增加趋于零.我可能至少需要将精度提高到零的顺序.
该fixed::sqrt()algorithim简要上面链接的文章第4页的解释,但我在努力遵循它更不用说确定它是否能够改善它.该功能的代码如下:
fixed fixed::sqrt() const
{
unsigned const max_shift=62;
uint64_t a_squared=1LL<<max_shift;
unsigned b_shift=(max_shift+fixed_resolution_shift)/2;
uint64_t a=1LL<<b_shift;
uint64_t x=m_nVal;
while(b_shift && a_squared>x)
{
a>>=1;
a_squared>>=2; …Run Code Online (Sandbox Code Playgroud) 最近我正在分析一个程序,其中热点肯定是这个
double d = somevalue();
double d2=d*d;
double c = 1.0/d2 // HOT SPOT
Run Code Online (Sandbox Code Playgroud)
之后不使用值d2,因为我只需要值c.前段时间我已经读过关于快速平方根的Carmack方法,显然不是这种情况,但我想知道类似的算法是否可以帮助我计算1/x ^ 2.
我需要非常准确的精度,我已经检查过我的程序没有使用gcc -ffast-math选项给出正确的结果.(克++ - 4.5)
square-root ×10
algorithm ×3
c++ ×2
java ×2
math ×2
performance ×2
sqrt ×2
c ×1
distance ×1
double ×1
embedded ×1
fixed-point ×1
history ×1
ieee-754 ×1
integer ×1
numpy ×1
python ×1
recursion ×1
return-value ×1