将浮点数与整数进行比较时,某些值对的评估时间比其他类似值的值要长得多.
例如:
>>> 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似乎更多地使用一些值而不是其他值.
我正在尝试打印类似off_t和size_t.什么是正确的占位符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.h已printf(),一个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) 首先,我要澄清,我现在非常熟悉的定义size_t和intptr_t,我不希望他们完成的任务的任何重复.
相反,我想知道以下内容.你知道任何平台,除了 x86/DOS(带有难以忍受的内存模型)演员阵容
void* a = ...;
size_t b = (size_t)a;
Run Code Online (Sandbox Code Playgroud)
实际上丢失了比特或字节?
谢谢!
当我读取一些代码时,对于整数,它们使用一堆不同类型的size_t, uint32, uint64等等.这样做的动机或目的是什么?为什么不用int?与平台交叉相关?或低级相关.
有时,代码对我有意义,因为他们只需要32位int或其他东西.但是,是什么size_t?请帮我说清楚.
或者它可以是一个单独的无符号整数类型?
我对不同的(无符号)整数类型有不同的模板函数特化.我需要提供单独的专业size_t吗?
我正在编写一个函数库,可以安全地在各种数字类型之间进行转换或者尝试.我的意图大致相当于创建有用库和学习C边缘案例.
我int-到- size_t功能引发了GCC -Wtype-limits,声称我不应该测试,如果一个警告int是大于SIZE_MAX,因为它永远不会是真实的.(另一个转换int为ssize_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) 这里有一个关于sizeof(size_t)和相等的问题sizeof(void*),公认的答案是它们不能保证相等。
但至少,必须是:
sizeof(void*) >= sizeof(size_t)
我想是这样。因为,取给定 C 实现中可能的最大存储对象,大小为S。现在,存储区域可以被认为是大小为 的字节数组S。因此,必须有一个指向每个字节的指针,并且所有这些指针都是可比较的和不同的。因此,类型 的不同元素的数量void*必须至少是类型 的最大数量size_t,这是无符号整数类型。因此sizeof(void*) >= sizeof(size_t)。
我的推理有道理吗?
我有这个代码可以在连接图中找到桥:
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)
那么,如何迭代地重写我的算法?