Como te dijo necro, long es un tipo entero de 64bits (en algunas plataformas, en C por ejemplo es igual a un int en maquinas a 32 bits), double es un tipo floating-point a 64bits (doble precision).
Normalmente el lenguaje permite asignar un long a un double, pero dependiendo del numero de bits del tipo de dato puede haber perdida de precision.