Câu hỏi được hỏi về cách mô phỏng phân chia số nguyên và modulo kiểu Python. Tất cả các câu trả lời được đưa ra ở đây cho rằng các toán hạng của hoạt động này là các số nguyên, nhưng Python cũng có thể sử dụng các phao cho hoạt động modulo của nó. Vì vậy, tôi nghĩ câu trả lời sau đây giải quyết vấn đề tốt hơn:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int pydiv(double a, double b) {
int q = a/b;
double r = fmod(a,b);
if ((r != 0) && ((r < 0) != (b < 0))) {
q -= 1;
}
return q;
}
int main(int argc, char* argv[])
{
double a = atof(argv[1]);
double b = atof(argv[2]);
printf("%d\n", pydiv(a, b));
}
Và đối với modulo:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
double pymod(double a, double b) {
double r = fmod(a, b);
if (r!=0 && ((r<0) != (b<0))) {
r += b;
}
return r;
}
int main(int argc, char* argv[])
{
double a = atof(argv[1]);
double b = atof(argv[2]);
printf("%f\n", pymod(a, b));
}
Tôi đã thử nghiệm hai chương trình trên với cách Python cư xử bằng cách sử dụng mã kiểm tra sau:
#!/usr/bin/python3
import subprocess
subprocess.call(["cc", "pydiv.c", "-lm", "-o", "cdiv"])
subprocess.call(["cc", "pymod.c", "-lm", "-o", "cmod"])
def frange(start, stop, step=1):
for i in range(0, int((stop-start)/step)):
yield start + step*i
for a in frange(-10.0, 10.0, 0.25):
for b in frange(-10.0, 10.0, 0.25):
if (b == 0.0):
continue
pydiv = a//b
pymod = a%b
cdiv = int(subprocess.check_output(["./cdiv", str(a), str(b)]))
cmod = float(subprocess.check_output(["./cmod", str(a), str(b)]))
if pydiv != cdiv:
exit(1)
if pymod != cmod:
exit(1)
Ở trên sẽ so sánh hành vi của phân chia Python và modulo với triển khai C tôi đã trình bày trên 6320 testcases. Kể từ khi so sánh thành công, Tôi tin rằng giải pháp của tôi thực hiện chính xác hành vi của Python đối với các hoạt động tương ứng của .
Nếu bạn muốn sử dụng hiệu quả bảng tra cứu. Nếu mã này là một vấn đề hiệu quả, sự thay thế thực sự duy nhất sẽ là sử dụng các toán tử thông dụng/và% và sống với phép làm tròn của chúng. –
Điều này khá gọn gàng.Sẽ rất hữu ích khi có một số niềng răng trong mã này (với nhiều điều kiện làm tổ, thật khó để nói điều gì đang xảy ra ở đâu ...) –
Có lẽ đây là vấn đề về hương vị, nhưng tôi không đồng ý rằng việc thêm niềng răng sẽ làm điều này dễ đọc hơn. Khi đọc mã, tôi nhìn vào thụt đầu dòng thay vì đếm niềng răng trong đầu. –