问题标签 [pow]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1607 浏览

android - 处理 glsl 中的未定义、NaN 或 Inf 值。思考数学错误

我仍然没有摆脱我的 glsl 着色器(GL 2.0)中的一些烦人的错误......我已经搜索了超过 3 周的这个问题的解决方案,但我没有得到任何解决方案。谷歌上有很多例子和解释,但没有一个真正有效。

首先,这是我的片段着色器代码。之后,我将解释究竟是什么问题:

有给出以下变量值,其中:

  • pl_ 是点光值,
  • dl_ 是方向光值,
  • mat_diff 是材质的漫反射值,
  • 还有 mat_spec、mat_elum、mat_shine 用于材质镜面反射、发光和光泽度,
  • N = 正常,
  • V = 视图向量到顶点,
  • L = 光向量到顶点,
  • R = 反射向量,
  • D = 光距,
  • DF = 混合光的距离因子,
  • S = 计算的镜面反射系数,
  • F = L,N 的点积
  • 和 diff,计算出的漫反射/规格矢量的规格矢量和。

现在出现以下问题: Pointlights 本身运行完美。定向灯本身也运行完美。但是它们在一起不会很好地工作。我将解决这个问题:我最多有 4 个点光源和 4 个定向光源。为了测试,我使用了 4 个点光源和 1 个定向光源。

  • 如果我注释掉定向灯的for循环计算,我得到以下结果: 禁用定向灯,启用点灯
  • 如果我注释掉点光源的 for 循环,我会得到以下结果: 点光源被禁用,方向灯被启用
  • 如果我启用了两个 for 循环,则会发生以下情况: 两种光源类型均已启用

定向光似乎完全被忽略了。汽车仅由点灯照明。

所以,我发现:如果我改变 for 循环的顺序,点灯 -> 定向灯,而不是 dirlights -> 点灯,效果会交换:点灯被忽略,定向灯被计算。

我也发现,这个问题一定是:pow() 函数或除以零,但是:如果我注释掉以下代码行:

我可以得到以下结果:

spec += 注释掉的行

-> 漫反射颜色通常为点光源和定向光源计算!

所以我想到了如何消除这个问题,因为我认为 0 power by 0 会导致数学错误。也除以零....如何避免未定义的值?

isnan() 或 isinf() 函数似乎在 android-glsl 中不存在。

安迪解决方案或提示我可以做得更好,这会奏效吗?如果它可以帮助一点点,我会很高兴任何答案。这让我很生气,因为 3 周。非常感谢帮手!:)

有关代码的更多信息: https ://github.com/Chrise55/Llama3D

克里斯

0 投票
4 回答
779 浏览

c++ - 为什么这个函数不超过值 2^31?

幂函数(用 C++ 编写)...

现在我做一些输出测试......

输出:

好吧,长期回落到 32 位大小(而不是保持为 64 位)似乎存在一些问题。我想知道为什么这不起作用,但如果我使用该long long类型,一切正常。

一些额外的信息:

我正在使用 C++ 和编译器 MinGW
我正在运行 64 位操作系统(Windows 7)

更新:

你们真棒!从来没想过会发生这样的事情。

我刚刚检查了一些使用的任意 PDT sizeof,这就是我发现的......

输出:

所以,它看起来像我的longint都是 32 位大小的。更多玩弄表明 intmax_t 类型也是 64 位的。实际上,每个 PDT 的上限为 64 位,所以如果我需要表示一个 128 位整数,c++ 是否有一个内置类(类似于BigIntegerJava 中的东西)?

0 投票
2 回答
498 浏览

c - 当 powl() 存在时,sscanf() 导致链接失败

当我编译下面的精简程序时,我从链接器收到以下错误:

如果我用 注释掉该行sscanf(),则编译成功,并且在功能减少的情况下程序可以正确运行。如果我改为注释掉包含的行,它也可以工作powl()

以下是版本:

相同的结果:

运行:

我究竟做错了什么?

0 投票
4 回答
49609 浏览

c# - Math.Pow() 在 .NET Framework 中是如何实现的?

我一直在寻找一种有效的方法来计算 a b(比如a = 2and b = 50)。首先,我决定看一下Math.Pow()函数的实现。但是在.NET Reflector中,我发现的只是:

Math.Pow()当我调用函数时,我可以看到哪些资源在里面发生了什么?

0 投票
2 回答
2913 浏览

c - gcc 和 math.h 的奇怪行为?

我一直在尝试构建一些使用数学函数的代码(例如pow)。

math.h-lm包括在内,并且在构建期间使用该标志。

当像这样调用编译时(-lm命令开头的标志),它失败了,说有一个未定义的引用pow

-lm标志放在命令的末尾时,它就起作用了!

这是正常的吗?

0 投票
2 回答
25747 浏览

c - C中幂函数的未定义参考错误

可能重复:在 C未定义对floor 的引用
中使用 pow() 时出现问题
pow' and

我正在使用 gcc 4.6.1。

代码片段:

终端:

如果我将 x 替换为 2,那么它将以预期的方式执行。pow 函数不接受变量作为参数吗?

注意:我在源文件中包含了 stdio.h 和 math.h。

0 投票
3 回答
422 浏览

c++ - C++:具有两个常量的 pow() 优化

简单的问题:当编译器面临一个调用,比如说,带有两个常量(即来自宏的值)的 pow() 时,它是通过在编译时评估它来优化的,还是仍然在运行时计算?

例子:

谢谢!

编辑如果没有,有没有办法在编译时将宏的平方/立方体计算为另一个宏(就像我在上面尝试的那样)?

0 投票
4 回答
4513 浏览

c - 替换非常慢的 pow() 函数

我们有一个 CFD 求解器,在运行模拟时,发现它在某些机器上运行异常缓慢,但在其他机器上却没有。使用 Intel VTune,发现以下行是问题(在 Fortran 中):

用 VTune 钻取,问题被追溯到call pow装配线,当跟踪堆栈时,它显示它正在使用__slowpow(). 经过一番搜索,这个页面出现了抱怨同样的事情。

在具有 libc 版本 2.12 的机器上,模拟耗时 18 秒。在具有 libc 版本 2.14 的机器上,模拟耗时 0 秒。

根据上述页面上的信息,当 base topow()接近 1.0 时会出现问题。所以我们做了另一个简单的测试,我们在之前用任意数字缩放基数,pow()然后除以pow()调用之后的指数。这也将 libc 2.12 的运行时间从 18 秒降至 0 秒。

然而,把它放在我们做的所有代码中是不切实际的a**b。如何替换pow()libc 中的函数?例如,我希望call powFortran 编译器生成的装配线调用pow()我们编写的自定义函数来进行缩放,调用 libc pow(),然后除以缩放。如何创建对编译器透明的中间层?

编辑

为了澄清,我们正在寻找类似(伪代码)的东西:

是否可以从 libc 加载pow并在我们的自定义函数中重命名以避免命名冲突?如果customPow.o文件可以pow从 libc 重命名,如果其他事情仍然需要 libc 会发生什么?这会导致libcpowcustomPow.o的命名冲突吗?pow

0 投票
2 回答
28557 浏览

c++ - 来自 math.h 库的 pow() - 如何使用函数应用

所以我正在编写一些代码,需要将函数的返回值提高到一定的幂。我最近发现使用 '^' 运算符进行求幂是没有用的,因为在 C++ 中它实际上是一个 XOR 运算符或类似的东西。现在这是我要编写的代码:


现在谁能告诉我这是否正确?我将解释代码。正如你们都知道的那样,我已经声明了一个 int 变量答案,并将其初始化为任何名为“base”的变量的值,提升为作用于任何其他名为“power”的变量的 raiseTo() 函数的返回值。当我这样做时(并且我在 Visual C++ 2010 速成版中编辑和编译我的代码),在单词 'pow' 下出现一个红色破折号,并且出现错误消息:“多个重载函数 'pow' 的实例与参数匹配list"

有人可以帮我解决这个问题吗?你们能否也向我解释一下整个 pow() 函数是如何工作的,因为坦率地说 www.cplusplus.com 的引用有点令人困惑,因为我仍然只是一个初学者!

0 投票
5 回答
28026 浏览

c++ - 使用递归将基数提高到其指数 - C++

我只是想编写一些代码,利用函数递归来提高基础。我知道递归不是在 C++ 中做事的最正确方法,但我只是想稍微探索一下这个概念。该程序要求用户提供一个基数和一个指数,然后控制台输出答案。这是我编写的程序:

有趣的是,当我运行这个程序时,它一直返回答案为“1”!有人可以帮我吗?