摘要:
我正在寻找最快的计算方法
(int) x / (int) y
Run Code Online (Sandbox Code Playgroud)
没有得到例外y==0.相反,我只想要一个任意的结果.
背景:
在编码图像处理算法时,我经常需要除以(累积的)α值.最简单的变体是带有整数运算的普通C代码.我的问题是,我通常得到结果像素的零误差除法alpha==0.然而,这正是结果无关紧要的像素:我不关心像素的颜色值alpha==0.
细节:
我正在寻找类似的东西:
result = (y==0)? 0 : x/y;
Run Code Online (Sandbox Code Playgroud)
要么
result = x / MAX( y, 1 );
Run Code Online (Sandbox Code Playgroud)
x和y是正整数.代码在嵌套循环中执行了很多次,所以我正在寻找一种摆脱条件分支的方法.
当y不超过字节范围时,我对解决方案感到满意
unsigned char kill_zero_table[256] = { 1, 1, 2, 3, 4, 5, 6, 7, [...] 255 };
[...]
result = x / kill_zero_table[y];
Run Code Online (Sandbox Code Playgroud)
但这显然不适用于更大的范围.
我想最后一个问题是:什么是最快的位,将hack改为0到任何其他整数值,同时保持所有其他值不变?
澄清
我不是100%确定分支太贵了.但是,使用了不同的编译器,所以我更喜欢基准测试而几乎没有优化(这确实值得怀疑).
当然,编译器很有用,但是我不能在C中表达"不关心"的结果,因此编译器永远无法使用全范围的优化.
代码应完全兼容C,主要平台是带有gcc&clang和MacOS的Linux 64位.
我一直在使用isinf,isnan在Linux平台上运行完美的功能.但是这在OS-X上不起作用,所以我决定使用std::isinf std::isnan哪种适用于Linux和OS-X.
但英特尔编译器无法识别它,我猜它是英特尔编译器中的一个错误,根据http://software.intel.com/en-us/forums/showthread.php?t=64188
所以,现在我只是想避免麻烦和定义自己的isinf,isnan执行.
有谁知道如何做到这一点?
编辑:
我最终在我的源代码中进行了制作isinf/ isnan工作
#include <iostream>
#include <cmath>
#ifdef __INTEL_COMPILER
#include <mathimf.h>
#endif
int isnan_local(double x) {
#ifdef __INTEL_COMPILER
return isnan(x);
#else
return std::isnan(x);
#endif
}
int isinf_local(double x) {
#ifdef __INTEL_COMPILER
return isinf(x);
#else
return std::isinf(x);
#endif
}
int myChk(double a){
std::cerr<<"val is: "<<a <<"\t";
if(isnan_local(a))
std::cerr<<"program says isnan";
if(isinf_local(a))
std::cerr<<"program says isinf";
std::cerr<<"\n";
return 0;
}
int main(){
double a …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个程序,其函数double_product(vector<double> a, vector<double> b)可以计算两个向量的标量积.标量产品是
$a_{0}b_{0}+a_{1}b_{1}+...+a_{n-1}b_{n-1}$.
Run Code Online (Sandbox Code Playgroud)
这就是我所拥有的.这是一团糟,但我正在努力!
#include <iostream>
#include <vector>
using namespace std;
class Scalar_product
{
public:
Scalar_product(vector<double> a, vector<double> b);
};
double scalar_product(vector<double> a, vector<double> b)
{
double product = 0;
for (int i = 0; i <= a.size()-1; i++)
for (int i = 0; i <= b.size()-1; i++)
product = product + (a[i])*(b[i]);
return product;
}
int main() {
cout << product << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,其中一些组件偶尔在大数据流中插入qNaN,然后使整个处理无效(包含单个qNaN的向量上的FFT导致全qNaN输出).现在我想抓住行动中的那个组成部分,并找出它为什么这样做.
为此,我需要在调试期间以某种方式使所有NaN信令.有没有办法这样做,x64 CPU执行32位代码?
我需要测试PostgreSQL中的数值/浮点值是否不是数字(NaN).请注意"PostgreSQL将NaN值视为相等",因此这个C++技巧不起作用.因为我isnan在PostgreSQL 9.3中没有看到任何功能,所以这是我最好的尝试:
create or replace function isnan(double precision) returns boolean as
$$select $1::text = 'NaN'::text$$ language sql;
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来测试NaN?
我要求检查是否浮动NaN.通过浏览一些链接,我发现了最常见的检查.
FLOAT32 f32_test_NaN = (some_value);
if (f32_test_NaN == f32_test_NaN)
{
//do something;
}
else
{
// do something;
}
Run Code Online (Sandbox Code Playgroud)
但这似乎对我不起作用.我的代码如下:
FLOAT32 test_NaN = 0x414570A3;//some value - is this ok?
Run Code Online (Sandbox Code Playgroud)
在GDB上调试:
(gdb) p test_NaN
$1 = 1.09506982e+09
(gdb) p/x test_NaN
$2 = 0x41457080 // Hex is not same as init value - What is compiler doing?
Run Code Online (Sandbox Code Playgroud)
所以在我的情况下test_NaN等于test_NaN.
如果必须进行任何编译器设置,请告诉我.我在solaris上运行.或者有没有其他方法来检查相同.
提前致谢.
如果我们将float和double类型设置为NaN,则它们不等于包括它们在内的任何东西.int
会发生这样的事吗?
我从"java concurrency in practice"中获得了以下代码:
public class Holder{
private int n;
public Holder(int n){this.n = n;}
public void assertSanity(){
if(n != n) throw new AssertionError("This statement is false.");
}
}
Run Code Online (Sandbox Code Playgroud)
我只是想知道这种情况n != n,在某种情况下这可能是真的吗?
我仍然不明白 NaN 或 a (数字不是\xc2\xb4t 实数)到底是什么。
\n\n主要问题:
\n\n此外,我对整个情况有几个问题,这让我在理解 NaN 应该是什么时抱怨,这对于回答我的主要问题来说不是必要的,但却是我想要的:
\n\n哪些操作会导致结果为 NaN 值?
为什么 0.0 / 0.0 的结果被声明为未定义?\xc2\xb4不应该是0吗?
为什么任何数学运算的结果都不能用浮点数或整数来表示?一个值怎么可能是不可表示的呢?
为什么负数的平方根不是实数?
为什么 NaN 不等于不定?
在整个互联网上,包括 Stack Overflow 上,我没有找到任何可以理解的解释 NaN 对我来说是什么。
\n\n无论如何,我想将我的研究作为地方链接提供,我已经扫描以找到我的问题的可以理解的答案,即使某些链接在其他编程语言中指向同一问题,但总体上没有给我所需的清晰信息:
\n\nhttps://en.wikipedia.org/wiki/NaN
\n\nhttps://en.wikipedia.org/wiki/IEEE_754
\n\nhttp://foldoc.org/Not-a-Number
\n\nhttps://www.youtube.com/watch?v=HN_UmxIVS6M
\n\nhttps://www.youtube.com/watch?v=9EsHjXftO7s
\n\n其他语言的类似或相同问题(我提供这些问题是因为我认为理解的基础即使不相同,也是非常相似的):
\n\n\n\n\n\n\n\n …