相关疑难解决方法(0)

为什么有些浮点数<整数比较慢四倍?

将浮点数与整数进行比较时,某些值对的评估时间比其他类似值的值要长得多.

例如:

>>> import timeit
>>> timeit.timeit("562949953420000.7 < 562949953421000") # run 1 million times
0.5387085462592742
Run Code Online (Sandbox Code Playgroud)

但是如果浮点数或整数变小或变大一定量,则比较运行得更快:

>>> timeit.timeit("562949953420000.7 < 562949953422000") # integer increased by 1000
0.1481498428446173
>>> timeit.timeit("562949953423001.8 < 562949953421000") # float increased by 3001.1
0.1459577925548956
Run Code Online (Sandbox Code Playgroud)

更改比较运算符(例如,使用==>替代)不会以任何明显的方式影响时间.

这并不仅仅与幅度有关,因为选择更大或更小的值可以导致更快的比较,因此我怀疑它是由于位排列的一些不幸的方式.

显然,对于大多数用例来说,比较这些值的速度要快得多.我只是好奇为什么Python似乎更多地使用一些值而不是其他值.

python floating-point performance cpython python-internals

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

我该如何打印off_t和size_t等类型?

我正在尝试打印类似off_tsize_t.什么是正确的占位符printf() 是可移植的

或者是否有完全不同的方式来打印这些变量?

c portability format-specifiers

141
推荐指数
3
解决办法
13万
查看次数

C中数组的最大大小是多少?

我知道硬件将限制程序执行期间分配的内存量.但是,我的问题是不考虑硬件.假设内存量没有限制,那么阵列没有限制吗?

c arrays

45
推荐指数
4
解决办法
12万
查看次数

C中的stdarg和printf()

<stdarg.h>头文件是用来做函数接受的参数未定义的数字,对不对?

所以,必须使用的printf()功能是接受大量的论点(如果我弄错了,请纠正我). 我在gcc的stdio.h文件中找到以下行:<stdio.h><stdarg.h>

#if defined __USE_XOPEN || defined __USE_XOPEN2K8
# ifdef __GNUC__
#  ifndef _VA_LIST_DEFINED
typedef _G_va_list va_list;
#   define _VA_LIST_DEFINED
#  endif
# else
#  include <stdarg.h>//////////////////////stdarg.h IS INCLUDED!///////////
# endif
#endif
Run Code Online (Sandbox Code Playgroud)

我无法理解其中的大部分内容,但它似乎包括在内 <stdarg.h>

所以,如果printf()使用<stdarg.h>接受可变数量的参数,并stdio.hprintf(),一个C程序中使用printf()无需包括<stdarg.h>不是吗?

我尝试了一个程序,它有printf()一个用户定义的函数接受可变数量的参数.

我尝试的程序是:

#include<stdio.h>
//#include<stdarg.h>///If this is included, the program works fine.

void fn(int num, ...)
{
    va_list vlist;
    va_start(vlist, num);//initialising va_start (predefined)

    int i; …
Run Code Online (Sandbox Code Playgroud)

c printf gcc variadic-functions

16
推荐指数
4
解决办法
3546
查看次数

size_t实际上是指针大小

首先,我要澄清,我现在非常熟悉的定义size_tintptr_t,我不希望他们完成的任务的任何重复.

相反,我想知道以下内容.你知道任何平台,除了 x86/DOS(带有难以忍受的内存模型)演员阵容

void* a = ...;
size_t b = (size_t)a;
Run Code Online (Sandbox Code Playgroud)

实际上丢失了比特或字节?

谢谢!

c

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

使用size_t uint32 uint64等的动机

当我读取一些代码时,对于整数,它们使用一堆不同类型的size_t, uint32, uint64等等.这样做的动机或目的是什么?为什么不用int?与平台交叉相关?或低级相关.

有时,代码对我有意义,因为他们只需要32位int或其他东西.但是,是什么size_t?请帮我说清楚.

c

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

size_t是否保证是整数类型之一的别名类型?

或者它可以是一个单独的无符号整数类型?

我对不同的(无符号)整数类型有不同的模板函数特化.我需要提供单独的专业size_t吗?

c++ types typedef

8
推荐指数
1
解决办法
728
查看次数

size_t(SIZE_MAX)的最大值是否相对于其他整数类型定义?

我正在编写一个函数库,可以安全地在各种数字类型之间进行转换或者尝试.我的意图大致相当于创建有用库和学习C边缘案例.

int-到- size_t功能引发了GCC -Wtype-limits,声称我不应该测试,如果一个警告int是大于SIZE_MAX,因为它永远不会是真实的.(另一个转换intssize_t生成相同警告的函数SSIZE_MAX.)

我的MCVE,有额外的评论和婴儿步骤,是:

#include <stdint.h>  /* SIZE_MAX */
#include <stdlib.h>  /* exit EXIT_FAILURE size_t */

extern size_t i2st(int value) {
    if (value < 0) {
        exit(EXIT_FAILURE);
    }
    // Safe to cast --- not too small.
    unsigned int const u_value = (unsigned int) value;
    if (u_value > SIZE_MAX) {  /* Line 10 */
        exit(EXIT_FAILURE);
    }
    // Safe to cast --- not too big.
    return (size_t) …
Run Code Online (Sandbox Code Playgroud)

c types integer limit

8
推荐指数
1
解决办法
6569
查看次数

必须 sizeof(void*) &gt;= sizeof(size_t) 吗?

这里有一个关于sizeof(size_t)和相等的问题sizeof(void*),公认的答案是它们不能保证相等。

但至少,必须是:

sizeof(void*) >= sizeof(size_t)

我想是这样。因为,取给定 C 实现中可能的最大存储对象,大小为S。现在,存储区域可以被认为是大小为 的字节数组S。因此,必须有一个指向每个字节的指针,并且所有这些指针都是可比较的和不同的。因此,类型 的不同元素的数量void*必须至少是类型 的最大数量size_t,这是无符号整数类型。因此sizeof(void*) >= sizeof(size_t)

我的推理有道理吗?

c language-lawyer

8
推荐指数
1
解决办法
239
查看次数

在没有递归的情况下在图中寻找桥梁

我有这个代码可以在连接图中找到桥:

void dfs (int v, int p = -1) {
    used[v] = true;
    tin[v] = fup[v] = timer++;
    for (size_t i=0; i<g[v].size(); ++i) {
        int to = g[v][i];
        if (to == p)  continue;
        if (used[to])
            fup[v] = min (fup[v], tin[to]);
        else {
            dfs (to, v);
            fup[v] = min (fup[v], fup[to]);
            if (fup[to] > tin[v])
                printf("%d %d", v, to);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在不使用递归的情况下重写它?我知道,可以这样做,我应该使用堆栈,但是必须在递归调用 dfs() 之后执行此行,而我无法使用堆栈实现:

fup[v] = min(fup[v], fup[to])
Run Code Online (Sandbox Code Playgroud)

那么,如何迭代地重写我的算法?

algorithm recursion graph

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