相关疑难解决方法(0)

无论结果是什么,支持除零的最快整数除法是什么?

摘要:

我正在寻找最快的计算方法

(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位.

c c++ optimization divide-by-zero

109
推荐指数
3
解决办法
6221
查看次数

如何制作便携式isnan/isinf功能

我一直在使用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)

c c++ math function

37
推荐指数
6
解决办法
4万
查看次数

检查NaN号码

是否可以检查号码是否有问题NaN

c++ numbers

21
推荐指数
2
解决办法
2万
查看次数

用C++计算两个向量的标量积

我正在尝试编写一个程序,其函数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)

c++

16
推荐指数
2
解决办法
5万
查看次数

诱捕安静的NaN

我有一个应用程序,其中一些组件偶尔在大数据流中插入qNaN,然后​​使整个处理无效(包含单个qNaN的向量上的FFT导致全qNaN输出).现在我想抓住行动中的那个组成部分,并找出它为什么这样做.

为此,我需要在调试期间以某种方式使所有NaN信令.有没有办法这样做,x64 CPU执行32位代码?

c++ debugging floating-point x86

13
推荐指数
2
解决办法
3940
查看次数

如何检查数字是否为NaN

我需要测试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

postgresql nan

12
推荐指数
2
解决办法
1万
查看次数

测试浮点值是否为NaN

可能重复:
检查double(或float)是否nan在C++中

我要求检查是否浮动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上运行.或者有没有其他方法来检查相同.

提前致谢.

c floating-point solaris nan

11
推荐指数
4
解决办法
3万
查看次数

int a; ...; (a == a)失败了吗?

如果我们将floatdouble类型设置为NaN,则它们不等于包括它们在内的任何东西.int
会发生这样的事吗?

c++

7
推荐指数
2
解决办法
761
查看次数

Can语句n!= n在多线程环境中返回true

可能重复:
如何模拟构造函数竞争条件?
如何证明未正确发布的值的竞争条件?

我从"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,在某种情况下这可能是真的吗?

java multithreading

7
推荐指数
1
解决办法
204
查看次数

用初学者的话说NaN(Not a Number)是什么?

我仍然不明白 NaN 或 a (数字不是\xc2\xb4t 实数)到底是什么。

\n\n

主要问题:

\n\n
    \n
  1. NaN 值或 NaN 到底是什么(用非数学教授的话说)?
  2. \n
\n\n

此外,我对整个情况有几个问题,这让我在理解 NaN 应该是什么时抱怨,这对于回答我的主要问题来说不是必要的,但却是我想要的:

\n\n
    \n
  1. 哪些操作会导致结果为 NaN 值?

  2. \n
  3. 为什么 0.0 / 0.0 的结果被声明为未定义?\xc2\xb4不应该是0吗?

  4. \n
  5. 为什么任何数学运算的结果都不能用浮点数或整数来表示?一个值怎么可能是不可表示的呢?

  6. \n
  7. 为什么负数的平方根不是实数?

  8. \n
  9. 为什么 NaN 不等于不定?

  10. \n
\n\n

在整个互联网上,包括 Stack Overflow 上,我没有找到任何可以理解的解释 NaN 对我来说是什么。

\n\n
\n\n

无论如何,我想将我的研究作为地方链接提供,我已经扫描以找到我的问题的可以理解的答案,即使某些链接在其他编程语言中指向同一问题,但总体上没有给我所需的清晰信息:

\n\n

维基百科:

\n\n

https://en.wikipedia.org/wiki/NaN

\n\n

https://en.wikipedia.org/wiki/IEEE_754

\n\n

其他:

\n\n

http://foldoc.org/Not-a-Number

\n\n

https://www.youtube.com/watch?v=HN_UmxIVS6M

\n\n

https://www.youtube.com/watch?v=9EsHjXftO7s

\n\n

堆栈溢出:

\n\n

其他语言的类似或相同问题(我提供这些问题是因为我认为理解的基础即使不相同,也是非常相似的):

\n\n

在Java中,NaN是什么意思?

\n\n

对于 IEEE754 NaN 值,所有比较都返回 false 的理由是什么?

\n\n

JavaScript 中检查字符串是否为有效数字的(内置)方法

\n\n …

math floating-point nan ieee-754

7
推荐指数
1
解决办法
7891
查看次数