[ot][spam][crazy] Inhibition Efforts: High-Precision
Undiscussed Horrific Abuse, One Victim of Many
gmkarl at gmail.com
Sun May 15 16:54:19 PDT 2022
// g++ -lgmpxx -lgmp
#include <gmpxx.h>
#include <string>
#include <iostream>
#include <ctime>
#include <cerrno>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
mpq_class now()
{
struct timespec t;
if (clock_gettime(CLOCK_MONOTONIC, &t)) {
throw std::runtime_error(std::strerror(errno));
}
return t.tv_sec + mpq_class(t.tv_nsec) / 1000000000;
}
class Measurer
{
public:
Measurer(char const * input_filename)
: current_time(0), fd(open(input_filename, O_RDONLY))
{ }
~Measurer()
{
close(fd);
}
void measure()
{
last_time = current_time;
last_value = current_value;
lseek(fd, 0, SEEK_SET);
int len = read(fd, buf, sizeof(buf));
buf[len] = 0;
if (buf[len-1] == '\n') { buf[len-1] = 0; }
current_time = now();
current_value = buf;
if (last_time != 0) {
time_change = current_time - last_time;
accumulated_time += time_change * 2;
accumulated_timevalues += time_change * (last_value +
current_value);
}
}
mpq_class value()
{
return accumulated_timevalues / accumulated_time;
}
mpq_class & time()
{
return last_time;
}
private:
int fd;
mpq_class last_time;
mpq_class last_value;
mpq_class current_time;
mpq_class current_value;
mpq_class time_change;
mpq_class accumulated_time;
mpq_class accumulated_timevalues;
char buf[1024];
};
int main(int argc, char **argv)
{
if (argc != 2) {
std::cout << "Usage: " << argv[0] << "
filepath-containing-a-changing-number" << std::endl;
return -1;
}
Measurer measurer(argv[1]);
mpq_class start_time = now();
while ("reading numbers from filepath") {
measurer.measure();
if (start_time + 1 <= measurer.time()) {
std::cout << "Average: " << measurer.value().get_d() << std::endl;
start_time += 1;
}
}
}
More information about the cypherpunks
mailing list